java - SBT 汇编在类文件中输出 0xEFBFBD 而不是 0xCAFEBABE

标签 java scala utf-8 sbt sbt-assembly

<表类=“s-表”> <标题> 工具 版本 <正文> 操作系统 Win10 JavaJDK 11 斯卡拉 2.13.5 SBT 1.3.13 组装 2.1.0

The repository of sbt-assembly

  1. 错误消息。

我跑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.12.0.0,并得到了相同的结果。

    我需要自定义合并策略,2.0.0之后才支持,所以没有尝试更多版本。

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

    最佳答案

    如果没有 build.sbtlibraryDependency assemblyMergeStrategy 以及没有无效的特定类的程序集 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 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/

    相关文章:

    scala - 为什么这里需要括号?

    scala - Spark Streaming DStream RDD 获取文件名

    c++ - 'BOM' 字符在文件开头或文件结尾的位置是什么?

    Javascript 不显示非标准字符

    python - 在 virtualenv 中使用 pip install 时出现 UnicodeDecodeError

    java - 使用 Apache POI 库检索 excel 中属性(列)的唯一值列表

    java - 如何禁用所有网络共享数据的互联网

    java - Spring-Boot/AMQP - 限制处理的消息数量

    java - JTree选择颜色

    authentication - 如何在 Play 框架中使用 Scala Secure Trait?