java - 如何让gradle下载库

标签 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 下载并安装这个库?

最佳答案

正如您在堆栈跟踪中可以看到的那样,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/caches/modules-2/files-2.1/commons-cli/commons-cli/1.4/c51c00206bb913cd8612b24abd9fa98ae89719b1/commons-cli-1.4.jar

一旦获得依赖 JAR 文件的路径,就可以使用带有 -cp 选项的 java 命令来扩展类路径。类路径用于告诉在哪里可以找到第三方二进制文件:

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

关于java - 如何让gradle下载库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503435/

相关文章:

java - 从上下文监听器共享 bean——调度程序 servlet

gradle - 如何将一个 gradle 任务包装在另一个任务中?

gradle - Gradle将发布从Gradle 4.x迁移到5.x?

java - 首次运行 jhipster 应用程序时出错

android - Gradle 不在 :app:mergeDebugResources failure 上构建

java - 从Zookeeper znode获取数据

java - java中类之间如何共享变量

java - 读取文件中的额外空间..?

java - HIbernate 多对一连接条件查询

java - Android:从头开始重建现有项目