7

我创建了一个简单的 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
}

我正在jar根据https://www.baeldung.com/gradle-fat-jar创建脂肪。

但是,生成的 jar 不包含该commons-lang3库。它只包含项目的类文件。

为什么我的库不包含在 fat 中jar

4

1 回答 1

10

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是空的。但是,建议不要简单地更改compileimplementation,而是使用runtimeClasspath(就像在用户指南中一样),因为这将正确处理仅适用于编译阶段或仅作为运行时的依赖项。虽然你现在没有这些,但将来可能。

于 2020-05-18T12:35:20.280 回答