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