【问题标题】:Building Java libraries which depend on other libraries构建依赖于其他库的 Java 库
【发布时间】:2018-04-09 05:11:13
【问题描述】:

我正在尝试创建一个 Java 库 (jar) 以在 Web 应用程序中使用,但我在依赖项方面有点挣扎。

说,如果我想要这个:

import org.apache.commons.lang3.StringUtils;

public class Shout {

    public static void main(String[] args) {
        new Shout().shout();
    }

    public void shout() {
        StringUtils.upperCase("help!");
    }

}

公开为喊叫.jar。

以上依赖于 StringUtils,但我不希望将 apache-commons.jar 打包在我的 say.jar 中。相反,我想找到一种方法(如果可能的话)让 Gradle 或 Maven 自动找出将使用shout.jar 的网络应用程序中的should.jar 需要哪些依赖项。

我尝试使用 Gradle(应用 java-library 插件)和 Maven(使用 jar 插件)构建一个库,但是当我将自己的 say.jar 作为 Gradle 依赖项时,它仍然无法解析 StringUtils.. .

在 jar 方面我有什么特别需要做的,让 Gradle 和 Maven 对解决我的 jar 的依赖感到满意吗?

更新详情

抱歉有点含糊。我会再试一次并提供更多详细信息。

所以,假设我在一个 Maven 项目中有我的 Shout 类。同上:

import org.apache.commons.lang3.StringUtils;

public class Shout {

    public static void main(String[] args) {
        new Shout().shout();
    }

    public void shout() {
        StringUtils.upperCase("help!");
    }

}

它有一个 pom 文件,里面有这个位(项目标签省略):

<groupId>michal</groupId>
<artifactId>shout</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.6</version>
    </dependency>

</dependencies>

现在,如果我运行一个 Maven jar 插件,我会得到一个不错的 jar 文件,名为 say-1.0-SNAPSHOT.jar。

如果我创建另一个名为 UsingShout 的项目,这次使用 Gradle 配置的 Gradle:

group 'michal'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    flatDir {
        dirs 'libs'
    }

}

dependencies {
    compile group: 'michal', name: 'shout', version: '1.0-SNAPSHOT'
}

我把我漂亮的 jar 文件放在 lib 目录中,例如:

(btw, the pom.xml is the same as above)

我尝试这样做:

public class UsingShout {

    public static void main(String[] args) {
        new UsingShout().go();    
    }

    private void go() {
        new Shout().shout();
    }

}

我明白了:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils

如果我没有很好地解释自己,我深表歉意。

谢谢。

【问题讨论】:

  • 您必须将此项目设为 maven 或 gradle 项目,之后您将在其他项目中将此项目用作 maven/gradle 依赖项而不是 JAR
  • 您需要显示不起作用的 POM 或构建文件。
  • 希望上面说的清楚一点

标签: java maven gradle jar lib


【解决方案1】:

如果你的应用程序是一个 maven 项目,你应该在你的 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.6</version>
</dependency>

【讨论】:

    【解决方案2】:

    好的,所以我找到了我的问题的答案...

    我的问题是我正在创建一个 JAR 文件并将其复制到 lib 文件夹,然后指示 Gradle 从 libs 文件夹中获取 JAR。

    我应该做的是做 mvn install (在 Shout 项目上)并把东西放在我的本地仓库中,然后让 Gradle 来处理它。像这样:

    group 'michal'
    version '1.0-SNAPSHOT'
    
    apply plugin: 'java'
    
    sourceCompatibility = 1.8
    
    repositories {
        mavenLocal()
    }
    
    dependencies {
        compile group: 'michal', name: 'shout', version: '1.0-SNAPSHOT'
    }
    

    【讨论】:

    • 对不起...如果您仍然认为我应该编辑它,我很乐意编辑它
    猜你喜欢
    • 2011-08-15
    • 2020-12-08
    • 2014-03-22
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多