首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构建是成功的,但是在Gradle依赖项中,运行时依赖关系似乎很糟糕。

构建是成功的,但是在Gradle依赖项中,运行时依赖关系似乎很糟糕。
EN

Stack Overflow用户
提问于 2016-01-17 08:28:24
回答 2查看 992关注 0票数 1
代码语言:javascript
复制
dependencies {
 compile 'org.slf4j:slf4j-api:1.7.13'
    compile group: 'org.apache.commons', name: 'commons-math3' , version: '+'
    testCompile 'junit:junit:4.12'
}

即使我添加了这个,当我运行gradle build时,它也能工作,并且可以编译带有commons 3的代码。但是当我在build/中运行jar文件时,

它表示线程“主”java.lang.NoClassDefFoundError中的异常:org/apache/commons/math3 3/复杂/复杂

但官方的Gradle站点表示,“编译”中的资源也将包含在“运行时”依赖项中。我还尝试在运行时中添加公共项--数学。但不起作用。

也许这就是我对依赖系统的误解。

如何将maven存储库中的外部库包含到由Gradle生成的jar文件中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-17 08:50:15

您要寻找的要么是由application插件生成的发行版zip,要么是由shadowJar插件生成的影子jar (也称为fat jar):

发行版zip (application插件)

关于分发拉链

分发拉链如下所示:

代码语言:javascript
复制
my-app-0.2.0.zip
├──bin
│  ├──my-app
│  └──my-app.bat
└──lib
   ├──my-app-0.2.0.jar
   ├──slf4j-api.1.7.13.jar
   └──commons-math3-3.6.jar

然后,您可以通过解压缩在build/distributions/中生成的内容并运行my-app.bat ( windows)或./my-app (在linux或OS上)来运行其依赖关系的应用程序。

构建分发拉链

下面是一个制作发行版zip的样例gradle构建文件:

build.gradle

代码语言:javascript
复制
apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'org.myapp.Main'

repositories { jcenter() }
dependencies {
    compile 'org.slf4j:slf4j-api:1.7.13'
    compile 'org.apache.commons:commons-math3:3.6'

    testCompile 'junit:junit:4.12'
}

可以使用gradle distributionZipgradle distributionTar运行。要只运行应用程序,请使用gradle run

影子罐

关于影子罐

影子jar是一个巨大的jar文件,它是你的程序和它的库的组合,打包成一个文件。您将得到一个自包含的文件,可以在大多数系统上双击运行(例如,在工作的Windows上,在Xubuntu上,可以通过右键单击并选择‘Runtime 8 Runtime’等方式运行。

构建分发拉链

下面是一个示例build.gradle文件:

代码语言:javascript
复制
apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'

mainClassName = 'org.myapp.Main'

jar {
    manifest {
        attributes('Main-Class': mainClassName)
    }
}

buildscript {
    repositories { jcenter() }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.2'
    }
}

repositories { jcenter() }
dependencies {
    compile 'org.slf4j:slf4j-api:1.7.13'
    compile 'org.apache.commons:commons-math3:3.6'

    testCompile 'junit:junit:4.12'
}

使用gradle shadowJar运行它-您的jar具有打包的依赖项将在build/libs中,它将被命名为my-app-x.x.x-all.jar

票数 3
EN

Stack Overflow用户

发布于 2016-01-17 08:47:29

Gradle首先是一个构建工具(就像maven,顺便说一句)。它的“责任”从你给它源文件时开始,当你得到你的工件(在你的例子中是一个jar)时结束。

现在,当您实际运行您的应用程序时,这里有大量不同的选项。如果您只是运行java -jar <your_jar>,那么您就有责任构建类路径。如果您使用某种外部运行程序运行它,您应该阅读它的文档,并为它提供一个类路径。

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34836488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档