Tools Version
OS Win10
JavaJDK 11
Scala 2.13.5
SBT 1.3.13
Assembly 2.1.0

The repository of sbt-assembly

  1. 错误消息.

我在SBTshell 中运行assembly,它输出[成功].

然后,我try 运行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开头.

我以二进制形式比较了这两个类文件.它们中的大多数都是相同的,但由ASSEMBLE命令生成的命令中有数百个.

  1. 我想要做的是.

我正在try 将一个包含多个模块的大型项目组装到一个.jar个文件中.

  • 整个项目用UTF-8=> idea :全球/项目编码:UTF-8

  • SBT有VM选项:-Dfile.encoding=UTF-8

  • Build.sbt有行:javaOptions ++= Seq("-encoding", "UTF-8")

我尽我所能确保所有文件都是以UTF-8编码和解码的.

  1. 其他版本的程序集.

我还try 了SBT-ASSEMBLE版本2.1.12.0.0,得到了相同的结果.

我需要定制2.0.0之后支持的合并策略,所以我没有try 更多的版本.

我不能在这里显示任何代码,因为我没有这样做的权利.但是如果你需要更多关于这个问题的信息,请让我知道.

推荐答案

如果没有build.sbt中的libraryDependenciesassemblyMergeStrategy,并且没有无效的特定汇编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相关问答推荐

编译期间错误(Java 0000)Android .Net MAUI

日食IDE 2024-03在Ubuntu下崩溃,导致hr_err_pid.log

gitlab ci不会运行我的脚本,因为它需要数据库连接'

H2弹簧靴试验跌落台

按属性值从流中筛选出重复项

我正在try 跟踪数组中最大的两个数字

当Volatile关键字真的是必要的时候?

自定义批注的外推属性值

Docker不支持弹性APM服务器

Java连接池无法正常工作

使用Class.this.field=Value初始化构造函数中的最后一个字段会产生错误,而使用this.field=Value则不会

Oj算法 MatrixR032从字符串、归一化和余弦相似度计算创建

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

如何生成指定范围内的11位序列号?

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

HBox内部的左对齐按钮(如果重要的话,在页码内)

Cucumber中第二个网页的类对象未初始化

如何转换Vector<;对象>;转换为int?

Vaadin Flow:设置密码显示按钮属性

Java ModbusRTU写寄存器