Gradle(Kotlin DSL) 依存Jarから特定ファイルを引っぺがす

blog1.mammb.com

遷移的に依存する Jar を除外するには、単に exclude を指定するだけで事足ります。

例えば以下は、org.hibernate:hibernate:3.1 が依存する対象を除外する例となります。

dependencies {
  implementation('org.hibernate:hibernate:3.1') {
    //excluding a particular transitive dependency:
    exclude module: 'cglib' //by artifact name
    exclude group: 'org.jmock' //by group
    exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group
  }
}

しかし、依存ライブラリJarの中に含まれる、特定のファイルだけを除外したいといったケースにはTransforming Artifactsを使うのが正式なのかもしれませんが、如何にも複雑すぎます。


例えば、gson の Jar から module-info.class を取り除きたいとします。

(gson 2.8 では、パッケージルートに module-info.class が存在します。2.9以降ではマルチモジュールJarになり、 META_INF/versions/9/module-info.class に存在します)

Configuration を作成して jar タスクで解いて、特定ファイルを除外してから、再度Jarに固めれば、希望するJarが作成できます。

val gson: Configuration by configurations.creating
dependencies {
    gson("com.google.code.gson:gson:2.8.6")
}
tasks.register<Jar>("stripJar") {
    archiveBaseName.set("gson")
    from(gson.map { zipTree(it) }) {
        exclude("module-info.class")
    }
}

Jar タスクではデフォルトで ${buildDir}/libs/ 以下にJarが作成されるので、このファイルに対して依存を定義します。

dependencies {
    implementation(files("${buildDir}/libs/gson.jar"))
}

tasks.withType<JavaCompile>().configureEach {
    dependsOn("stripJar")
}

JavaCompile 前にJarを作成するよう依存タスクとして定義しています。

以上で、依存Jarから無理やり特定のファイルを引っぺがすことができます。