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
}

https://www.baeldung.com/gradle-fat-jarjarに従って脂肪を作成しています。

commons-lang3ただし、結果の jar にはライブラリが含まれていません。プロジェクトのクラス ファイルのみが含まれます。

ライブラリが 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、空です。ただし、単に に変更compileするのimplementationではなく、(ユーザー ガイドのように) を使用することをお勧めしますruntimeClasspath。これにより、コンパイル フェーズのみ、またはランタイムのみにスコープが設定された依存関係が正しく処理されるためです。現在はそれらのいずれも持っていませんが、将来的にはそうなる可能性があります。

于 2020-05-18T12:35:20.280 に答える