工具 | 版本 |
---|---|
操作系统 | Win10 |
JavaJDK | 11 |
斯卡拉 | 2.13.5 |
SBT | 1.3.13 |
组装 | 2.1.0 |
我在 sbt shell 中运行
assembly
并打印 [成功].
然后我尝试在 cmd 中使用 java -jar MyProject.jar
运行输出
.jar,并得到这个错误:
java.lang.ClassFormatError: Incompatible magic value 4022320623 in class file Main
与此相同的错误消息:Java Incompatible magic value 4022320623
但是我所有的工作都是在本地完成的,没有任何上传下载操作。
解压.jar包,发现所有.class文件都是以
0xEFBFBD EFBFBD
开头的,也就是说UTF-8
不能识别字符。
我以前运行过
sbt package
,在那种情况下,每个java类文件都以0xCAFE BABE
开始。
我以二进制形式比较了这两个类文件。大部分都是一样的,只是汇编命令生成的里面有几个
0xEFBFBD
我正在尝试将一个包含多个模块的大型项目组装到一个 .jar 文件中。
整个项目编码为
UTF-8
=>
IDEA:全局/项目编码:UTF-8
SBT 有 VM 选项:
-Dfile.encoding=UTF-8
build.sbt 有一行:
javaOptions ++= Seq("-encoding", "UTF-8")
我尽我所能确保所有文件都在
UTF-8
中编码和解码。
我还尝试了 sbt-assembly 版本 2.1.1 和 2.0.0,并得到了相同的结果。
我需要自定义2.0.0后支持的Merge Strategy,所以我没有尝试更多版本。
我不能在这里显示任何代码,因为我无权这样做。但是,如果您需要有关此问题的更多信息,请告诉我。
如果没有您的
libraryDependencies
的assemblyMergeStrategy
和build.sbt
,并且没有特定类别的无效组装罐,很难说。
我怀疑
MergeStrategy.concat
或 MergeStrategy.filterDistinctLines
被错误地应用于某些 .class
文件,这导致无效的类文件。 MergeStrategy.concat / filterDistinctLines
用于配置文件、.properties
文件、服务文件(即名称为com.example.SomeInterface
和内容为com.example.impl.SomeImplementation
的文件)等,不适用于.class
文件。
可以暂时把
assemblyMergeStrategy
改成
assembly / assemblyMergeStrategy := {
case _ => MergeStrategy.singleOrError
}
查看所有重复项,或者
ThisBuild / assemblyMergeStrategy := {
case PathList(ps @ _*) if ps.last endsWith ".class" => MergeStrategy.singleOrError
case x =>
val oldStrategy = (ThisBuild / assemblyMergeStrategy).value
oldStrategy(x)
}
查看所有
.class
重复项。您应该在其中看到在 MergeStrategy.concat/filterDistinctLines
. 时变得无效的类文件
Sbt 1.3.13 很旧,当前是 1.8.2.