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-math3 的代码。但是当我在 build/中运行一个 jar 文件时,
它说 Exception in thread "main"java.lang.NoClassDefFoundError: org/apache/commons/math3/complex/Complex
但是 Gradle 官方网站说,'compile' 中的资源也将包含在 'runtime' 依赖项中。我还尝试将 commons-math 添加到运行时。但它不起作用。
也许这是我对依赖系统的误解。
如何将 Maven 存储库中的外部库包含到 Gradle 生成的 jar 文件中。
最佳答案
您正在寻找的是 application
插件生成的分发 zip 或 shadowJar
插件生成的 shadow jar(也称为 fat jar):
分发 zip(application
插件)
关于分发 zip
分发 zip 看起来像这样:
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 X 上)
构建分发 zip
这是一个用于制作分发 zip 的示例 gradle 构建文件:
build.gradle
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 distributionZip
或 gradle distributionTar
运行。要仅运行该应用程序,请使用 gradle run
。
阴影 jar
关于影子 jar
shadow jar 是一个巨大的 jar 文件,它是您的程序及其库的组合,打包到一个文件中。您将获得一个独立的文件,可以通过在大多数系统上双击运行(例如,在可以运行的 Windows 上,在 Xubuntu 上,可以通过右键单击并选择“使用 Oracle Java 8 运行时运行”来运行它,等等……)。
构建分发 zip
这里又是一个示例 build.gradle
文件:
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
。
关于java - 构建成功,但运行时依赖在 Gradle 依赖中似乎很糟糕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34836488/