Gradle fat jar 不包含库
Gradle fat jar does not contain libraries
我创建了一个简单的 Gradle Java 项目。 build.gradle
文件如下所示:
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.10'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0'
}
test {
useJUnitPlatform()
}
task customFatJar(type: Jar) {
archiveBaseName = 'fat-jar'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
我正在根据https://www.baeldung.com/gradle-fat-jar创造脂肪jar
。
但是,生成的 jar 不包含 commons-lang3
库。它仅包含项目的 class 个文件。
为什么我的库没有包含在 fat jar
中?
来自 Baeldung 的指南已过时。我建议改为遵循官方用户指南中的指南:https://docs.gradle.org/current/userguide/building_java_projects.html#sec:java_packaging
他们目前的建议是:
task uberJar(type: Jar) {
archiveClassifier = 'uber'
from sourceSets.main.output
dependsOn configurations.runtimeClasspath
from {
configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
}
}
如果您不喜欢使用像 archiveClassifier
.
这样的属性,您可以像以前那样自定义名称
如果您对为什么 Baeldung 版本不适合您感兴趣,那是因为它们从名为 compile
的已弃用配置中收集依赖项。您使用的是较新的 implementation
,因此 compile
为空。然而,不是简单地将 compile
更改为 implementation
,而是建议使用 runtimeClasspath
(就像在用户指南中那样),因为这将正确处理仅限于编译阶段或仅作为运行时。虽然您现在没有这些,但将来可能会有。
我创建了一个简单的 Gradle Java 项目。 build.gradle
文件如下所示:
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.10'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0'
}
test {
useJUnitPlatform()
}
task customFatJar(type: Jar) {
archiveBaseName = 'fat-jar'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
我正在根据https://www.baeldung.com/gradle-fat-jar创造脂肪jar
。
但是,生成的 jar 不包含 commons-lang3
库。它仅包含项目的 class 个文件。
为什么我的库没有包含在 fat jar
中?
来自 Baeldung 的指南已过时。我建议改为遵循官方用户指南中的指南:https://docs.gradle.org/current/userguide/building_java_projects.html#sec:java_packaging
他们目前的建议是:
task uberJar(type: Jar) {
archiveClassifier = 'uber'
from sourceSets.main.output
dependsOn configurations.runtimeClasspath
from {
configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
}
}
如果您不喜欢使用像 archiveClassifier
.
如果您对为什么 Baeldung 版本不适合您感兴趣,那是因为它们从名为 compile
的已弃用配置中收集依赖项。您使用的是较新的 implementation
,因此 compile
为空。然而,不是简单地将 compile
更改为 implementation
,而是建议使用 runtimeClasspath
(就像在用户指南中那样),因为这将正确处理仅限于编译阶段或仅作为运行时。虽然您现在没有这些,但将来可能会有。