web-dev-qa-db-ja.com

sbtアセンブリ:module-info.classの重複排除

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を誰かに教えてもらえますか?

12
Jake

答えは、環境と達成したいことによって異なります。

JDK 8

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

エンドユーザープロジェクト(ライブラリではない)でJDK 11を使用する場合、uber-jarを作成する場合と同様にすべてのクラスが含まれ、外部の依存関係は必要ありません。短いテストでテストしただけです(常に安全であるとは言えません)。

JDK 11を使用してライブラリを作成する場合は、uber-jarを作成しないことをお勧めします。この場合、module-info.classを削除すると、機能しないjarが作成される可能性が高くなります。この場合、単にライブラリに依存します。

16
Uwe Plonus