构建依赖于其他库的Java库

时间:2017-10-27 14:42:21

标签: java maven gradle jar lib

我正在尝试创建一个在Web应用程序中使用的Java库(jar),但我正在努力与依赖关系。

说,如果我想要这个:

import org.apache.commons.lang3.StringUtils;

public class Shout {

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

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

}

暴露为shout.jar。

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

我尝试使用Gradle(应用java-library插件)和Maven(使用jar插件)构建lib,但是当我将shout.jar作为Gradle依赖项时 - 它将无法解析StringUtils .. 。

对于Gradle而言,我需要在jar方面做些什么吗?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插件,我有一个名为shout-1.0-SNAPSHOT.jar的漂亮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

如果我不能很好地解释自己,我道歉。

谢谢。

2 个答案:

答案 0 :(得分:1)

如果您的应用程序是maven项目,则应将以下依赖项添加到pom.xml中:

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

答案 1 :(得分:0)

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

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

我应该做的是做mvn install(在Shout proj上)并把它放在我的本地仓库中,然后让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'
}