【发布时间】: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 或构建文件。
-
希望上面说的清楚一点