我正在学习Java“艰难的方式”,这意味着没有任何IDE。相反,我依靠gradle和我的文本编辑器。这一刻,我的项目看起来像这样:
├── build.gradle
└── src
├── main
│ └── java
│ └── CliOptionsTryout.java
build.gradle的内容:
apply plugin: 'java'
repositories {
jcenter()
}
dependencies {
compile 'commons-cli:commons-cli:1.4'
compile 'org.slf4j:slf4j-api:1.7.22'
testCompile 'junit:junit:4.12'
}
CliOptionsTryout.java的内容:
import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CliOptionsTryout {
public static void main(String[] args) {
Options options = new Options(); // <=== FAILED HERE
options.addOption("h", "help", false, "show help.");
options.addOption("v", "var", true, "Here you can set parameter .");
}
}
项目使用gradle build
成功构建,但当我执行java CliOptionsTryout -v 100
时,出现以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/Options
at CliOptionsTryout.main(CliOptionsTryout.java:11)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.Options
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
我知道原因是它无法找到commons-cli库。所以,问题是,如何告诉gradle下载并安装此库?
答案 0 :(得分:3)
正如您可以在堆栈跟踪中读到的那样,Java可执行文件找不到类org.apache.commons.cli.Options
。此类是您正在使用的依赖项的一部分。
执行java CliOptionsTryout
时,Java可执行文件会查找二进制文件(当前文件夹中的 .class 文件)。您收到错误,因为Gradle不会在您的CliOptionsTryout.class
文件所在的文件夹中获取依赖项(JAR文件)。
如果您想成功运行您的类,您需要告诉Java可执行文件在哪里可以找到包含您正在使用的库的.class
文件的JAR文件。
默认情况下,Gradle会在$HOME/.gradle/...
中获取所有JAR依赖项。您缺少的依赖项是版本1.4中的Apache commons CLI。以下是找到确切路径的命令:
find $HOME/.gradle -name "commons-cli-1.4.jar"
例如,我得到以下内容:
$ HOME / .gradle /高速缓存/模块-2 /文件-2.1 /公地-CLI /公地-CLI / 1.4 / c51c00206bb913cd8612b24abd9fa98ae89719b1 /公地-CLI-1.4.jar
获得依赖项JAR文件的路径后,可以使用带有java
选项的-cp
命令来扩展类路径。类路径用于告知在哪里查找第三方二进制文件:
java -cp $HOME/.gradle/caches/modules-2/files-2.1/commons-cli/commons-cli/1.4/c51c00206bb913cd8612b24abd9fa98ae89719b1/commons-cli-1.4.jar:. CliOptionsTryout
在现实世界中,我建议为您的应用生成一个JAR文件(包括所有依赖项),并使用java -jar
直接执行此文件。如果您有兴趣学习如何操作,请查看Gradle application plugin。