Uber jarをアセンブルすると、次のエラーが表示されます。
Java.lang.RuntimeException:deduplicate:異なるファイルの内容が次の場所にあります:[error] /Users/jake.stone/.ivy2/cache/org.bouncycastle/bcprov-jdk15on/jars/bcprov-jdk15on-1.61.jar:module -info.class [エラー] /Users/jake.stone/.ivy2/cache/javax.xml.bind/jaxb-api/jars/jaxb-api-2.3.1.jar:module-info.class
Javaテクノロジーについては最新ではありませんが、これらのクラスの1つを単に破棄することはできないと想定しています。
Uber jarを安全にコンパイルするために使用できるmergeStrategyを誰かに教えてもらえますか?
答えは、環境と達成したいことによって異なります。
JDK 8を使用するプロジェクトでも同じ問題が発生しました。JDK8はファイルmodule-info.class
を使用しないため、ファイルを破棄しても安全です。
以下をbuild.sbt
に追加してください:
assemblyMergeStrategy in Assembly := {
case "module-info.class" => MergeStrategy.discard
case x =>
val oldStrategy = (assemblyMergeStrategy in Assembly).value
oldStrategy(x)
}
これは単にファイルを破棄するだけです。
エンドユーザープロジェクト(ライブラリではない)でJDK 11を使用する場合、uber-jarを作成する場合と同様にすべてのクラスが含まれ、外部の依存関係は必要ありません。短いテストでテストしただけです(常に安全であるとは言えません)。
JDK 11を使用してライブラリを作成する場合は、uber-jarを作成しないことをお勧めします。この場合、module-info.class
を削除すると、機能しないjarが作成される可能性が高くなります。この場合、単にライブラリに依存します。