SBT 汇编输出 0xEFBFBD 而不是类文件中的 0xCAFEBABE

问题描述 投票:0回答:1
工具 版本
操作系统 Win10
JavaJDK 11
斯卡拉 2.13.5
SBT 1.3.13
组装 2.1.0

sbt-assembly 的存储库

  1. 错误信息。

我在 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

但是我所有的工作都是在本地完成的,没有任何上传下载操作。

  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后支持的Merge Strategy,所以我没有尝试更多版本。

我不能在这里显示任何代码,因为我无权这样做。但是,如果您需要有关此问题的更多信息,请告诉我。

java scala utf-8 sbt sbt-assembly
1个回答
0
投票

如果没有您的

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.

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