The repository of sbt-assembly
- 错误消息。
我跑assembly
在 sbt shell 中并打印 [成功]。
然后我尝试使用 java -jar MyProject.jar
运行输出 .jar在 cmd 中,出现此错误:
java.lang.ClassFormatError: Incompatible magic value 4022320623 in class file Main
与此相同的错误消息:Java Incompatible magic value 4022320623
但我所有的工作都是在本地完成的,没有任何上传或下载操作。
- 类文件的 header 。
我解压.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-assemble 版本 2.1.1 和 2.0.0,并得到了相同的结果。
我需要自定义合并策略,2.0.0之后才支持,所以没有尝试更多版本。
我无法在这里显示任何代码,因为我无权这样做。但如果您需要有关此问题的更多信息,请告诉我。
最佳答案
如果没有 build.sbt
的 libraryDependency
和 assemblyMergeStrategy
以及没有无效的特定类的程序集 jar,很难说。
我怀疑 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 standardStrategy = (ThisBuild / assemblyMergeStrategy).value
standardStrategy(x)
}
查看所有.class
重复项。您应该会在其中看到在 MergeStrategy.concat/filterDistinctLines
上变得无效的类文件。
Sbt 1.3.13 已经很旧了,当前版本是 1.8.2。
关于java - SBT 汇编在类文件中输出 0xEFBFBD 而不是 0xCAFEBABE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75955027/