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(就像在用户指南中那样),因为这将正确处理仅限于编译阶段或仅作为运行时。虽然您现在没有这些,但将来可能会有。