工具 | 版本 |
---|---|
操作系统 | Win10 |
JavaJDK | 十一 |
斯卡拉 | 2.13.5 |
SBT | 1.3.13 |
装配 | 2.1.0 |
The repository of sbt-assembly
1.错误消息。
我在sbt shell中运行assembly
,它会输出[success]。
然后,我尝试在cmd中使用java -jar MyProject.jar
运行输出 .jar,并得到以下错误:
java.lang.ClassFormatError: Incompatible magic value 4022320623 in class file Main
与此相同的错误消息:Java Incompatible magic value 4022320623
但是我所有的工作都是在本地完成的,没有任何上传或下载操作。
1.类文件的头。
我解压缩 .jar 包,发现所有 .class 文件都以0xEFBFBD EFBFBD
开头,这意味着UTF-8
无法识别该字符。
我以前运行过sbt package
,在这种情况下,每个java类文件都是以0xCAFE BABE
开头的。
我比较了这两个二进制形式的类文件,大部分都是一样的,但是汇编命令生成的类文件里面有几个0xEFBFBD
。
1.我想做的事。
我正在尝试将一个包含多个模块的大型项目组装到一个 .jar 文件中。
- 整个项目的编码格式为
UTF-8
=〉IDEA:全局/项目编码:UTF-8
- SBT具有VM选项:
-Dfile.encoding=UTF-8
- build.sbt有一行:
javaOptions ++= Seq("-encoding", "UTF-8")
我尝试了一切我可以确保所有的文件都编码和解码在UTF-8
。
1.程序集的其他版本。
我还尝试了sbt-assembly版本 2.1.1 和 2.0.0,得到了相同的结果。
我需要自定义 2.0.0 之后支持的合并策略,所以我没有尝试更多版本。
我不能在这里显示任何代码,因为我没有权利这样做。但如果你需要更多关于这个问题的信息,请让我知道。
1条答案
按热度按时间wgeznvg71#
很难说没有
build.sbt
的libraryDependencies
和assemblyMergeStrategy
,也没有无效的特定assembly jar类。我怀疑
MergeStrategy.concat
或MergeStrategy.filterDistinctLines
被错误地应用到一些.class
文件,这导致无效的类文件。MergeStrategy.concat / filterDistinctLines
是配置文件,.properties
文件,服务文件(即文件名为com.example.SomeInterface
和内容com.example.impl.SomeImplementation
)等,而不是.class
文件。您可以临时将
assemblyMergeStrategy
更改为查看所有副本,或者
查看所有
.class
副本。您应该可以看到其中的类文件在MergeStrategy.concat/filterDistinctLines
上无效。Sbt 1.3.13已经很老了,现在的版本是1.8.2。