
遷移的に依存する 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から無理やり特定のファイルを引っぺがすことができます。