如何让gradle下载库

时间:2017-04-19 18:26:46

标签: java gradle

我正在学习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下载并安装此库?

1 个答案:

答案 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