Gradle で Uber Jar(Fat Jar) の Source Jar を作成する

blog1.mammb.com


sourcesJar タスク

Source Jar は、Java Plugin で 提供される withSourcesJar() メソッドにより、 sourcesJar タスクを追加することができる(プロジェクトに sourcesJar という名前の既タスクが存在する場合には、タスクは作成されない)。

java {
    withSourcesJar()
}

このタスクは、sourceSets.main のソースを、classifier sources として Jar パッケージを作成する。 sourcesJar タスクは assemble タスクの依存として登録される。


例えば以下のように Uber Jar を作成していたとしても、Source Jar は対象プロジェクトのソースしか含まれない。

tasks.named<Jar>("jar") {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    dependsOn(configurations.runtimeClasspath)
    from({
        configurations.runtimeClasspath.get()
            .filter { it.name.endsWith("jar") }
            .map { zipTree(it) }
    })
}


sourcesJar へのソース追加

以下のようにソースを追加する。

val copySources: Configuration by configurations.creating

dependencies {
    implementation(project(":common"))
    implementation("org.apache.commons:commons-lang3:3.12.0")
    copySources("org.apache.commons:commons-lang3:3.12.0:sources")
}

tasks.named<Jar>("sourcesJar") {
    from(project(":common").sourceSets.main.get().allSource)
    from({
        copySources.map { zipTree(it) }
    })
}

サブプロジェクトからソースを追加するには、単にサブプロジェクトの sourceSets.main を追加する。

依存ライブラリは、classifier sources として(Source Jar が公開されているのもに限る) configuration を作成して取込できる。