You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在IntelliJ中用build.sbt排除JAR依赖签名文件及解决签名摘要异常

解决「Invalid signature file digest for Manifest main attributes」异常的有效方案

我之前在维护Scala 2.11.x + SBT的老项目时,也碰到过一模一样的问题——明明按常规方法排除了签名文件,运行JAR时还是报这个错误,尤其是用IntelliJ 2018.x这种老版本IDE的时候,坑特别多。结合我当时的排查经验,给你几个亲测有效的解决办法:


1. 强制设置SBT Assembly的合并策略(最常用)

如果你的项目用的是sbt-assembly插件打包,常规的依赖排除有时候会因为合并策略优先级问题不生效。直接在build.sbt里添加明确的合并策略,把所有签名相关文件直接丢弃:

// 先确保你已经添加了assembly插件(如果没加的话,在project/plugins.sbt里加:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.10"))
mergeStrategy in assembly := {
  case PathList("META-INF", xs @ _*) =>
    xs.map(_.toLowerCase) match {
      // 保留必要的manifest文件,丢弃所有签名相关的.SF/.DSA/.RSA
      case ("manifest.mf" :: Nil) => MergeStrategy.first
      case _ if xs.exists(f => f.endsWith(".sf") || f.endsWith(".dsa") || f.endsWith(".rsa")) => MergeStrategy.discard
      case _ => MergeStrategy.discard // 也可以根据需要保留其他META-INF文件,比如services目录
    }
  case x => MergeStrategy.first
}

添加完之后,执行sbt clean assembly重新打包,再运行JAR试试。


2. 检查IntelliJ Artifact打包配置(针对用IDE直接打包的情况)

如果你是直接用IntelliJ的Artifact功能打包,而不是用SBT命令行,那SBT里的配置可能根本没生效。按这个步骤排查:

  • 打开File -> Project Structure -> Artifacts
  • 找到你创建的JAR Artifact,展开左侧的依赖列表
  • 逐个点开依赖的JAR包,找到META-INF目录下的.SF、.DSA、.RSA文件,右键选择Exclude
  • 点击Apply后,重新构建Artifact(Build -> Build Artifacts -> Rebuild)

老版本的IntelliJ有时候会默认把所有依赖的文件都打包进去,包括签名文件,所以必须手动排除。


3. 清理所有缓存(解决老版本IDE/SBT的缓存冲突)

IntelliJ 2018.1和SBT的缓存经常会有奇怪的冲突,导致排除策略不生效:

  1. 先在命令行执行sbt clean,然后删除项目根目录下的target文件夹
  2. 清空IntelliJ缓存:File -> Invalidate Caches / Restart,选择Invalidate and Restart
  3. 手动删除本地Ivy缓存:找到~/.ivy2/cache目录,删掉org.scalatest和org.scala-lang.modules对应的文件夹,然后重新执行sbt update拉取依赖

4. 针对SBT默认打包的配置(不用assembly插件的情况)

如果你的项目用的是SBT默认的package命令打包,那需要修改packageOptions来排除签名文件:

packageOptions ++= Seq(
  Package.Distribution.Discard("META-INF/*.SF"),
  Package.Distribution.Discard("META-INF/*.DSA"),
  Package.Distribution.Discard("META-INF/*.RSA")
)
// 记得指定主类,否则运行JAR时会报找不到主类
mainClass in (Compile, packageBin) := Some("com.yourpackage.YourMainClass")

最后排查小技巧

打包完之后,把JAR文件解压,检查META-INF目录下有没有.SF、.DSA、.RSA文件。如果还有,说明你的排除策略没生效,再回头检查对应的配置;如果没有了,运行JAR应该就能正常启动了。

内容的提问来源于stack exchange,提问作者James S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:09:09