2017-04-19 49 views
0

我正在学习Java“硬的方法”,意思是没有任何IDE。相反,我依靠gradle和我的文本编辑器。 A这一刻,我的项目是这样的:如何获取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下载并安装这个库?

+1

使用应用程序插件并让gradle为您生成一个应用程序(具有所有必需的依赖项,启动脚本等)。 https://docs.gradle.org/current/userguide/application_plugin.html –

+0

我喜欢@ JBNizet的建议,它适用于我。谢谢。 –

回答

3

由于您可以读取堆栈跟踪中的Java可执行文件,因此无法找到类org.apache.commons.cli.Options。该类是您正在使用的依赖项的一部分。

当您执行java CliOptionsTryout时,Java可执行文件会查找二进制文件(当前文件夹中的.class文件)。您遇到错误是因为Gradle在您的​​3210文件所在的文件夹中没有获取依赖关系(JAR文件)。

如果要成功运行类,则需要告诉Java可执行文件在哪里可以找到包含您正在使用的库的.class文件的JAR文件。

默认情况下,Gradle获取$HOME/.gradle/...中的所有JAR依赖关系。您缺少的依赖项是版本1.4中的Apache commons CLI。下面是定位准确路径命令:

find $HOME/.gradle -name "commons-cli-1.4.jar" 

举例来说,我得到如下:

$HOME/.gradle/caches/modules-2/files-2.1/commons-cli/commons-cli/1.4/c51c00206bb913cd8612b24abd9fa98ae89719b1/commons-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