sbt assembly:deduplicate module-info.class

问题描述 投票:1回答:1

组装我的超级罐时出现以下错误:

java.lang.RuntimeException:deduplicate:以下找到的不同文件内容:[error] /Users/jake.stone/.ivy2/cache/org.bouncycastle/bcprov-jdk15on/jars/bcprov-jdk15on-1.61.jar:module -info.class [error] /Users/jake.stone/.ivy2/cache/javax.xml.bind/jaxb-api/jars/jaxb-api-2.3.1.jar:module-info.class

我不是最新的Java技术,但我想我不能简单地丢弃其中一个类。

有人能告诉我什么mergeStrategy我可以使用安全编译超级罐?

sbt sbt-assembly
1个回答
5
投票

答案取决于您的环境以及您想要实现的目标。

JDK 8

我使用JDK 8的项目遇到了同样的问题.JDK 8没有使用文件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并创建一个库,那么最好不要创建一个超级jar。在这种情况下,丢弃module-info.class很可能会创建一个无法工作的jar。在这种情况下,只需依赖于库。

© www.soinside.com 2019 - 2024. All rights reserved.