2017-04-19 48 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