java SBT程序集输出0xEFBFBD,而不是类文件中的0xCAFEBABE

mspsb9vt  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(109)
工具版本
操作系统Win10
JavaJDK十一
斯卡拉2.13.5
SBT1.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.12.0.0,得到了相同的结果。
我需要自定义 2.0.0 之后支持的合并策略,所以我没有尝试更多版本。
我不能在这里显示任何代码,因为我没有权利这样做。但如果你需要更多关于这个问题的信息,请让我知道。

wgeznvg7

wgeznvg71#

很难说没有build.sbtlibraryDependenciesassemblyMergeStrategy,也没有无效的特定assembly jar类。
我怀疑MergeStrategy.concatMergeStrategy.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。

相关问题