在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的缓存经常会有奇怪的冲突,导致排除策略不生效:
- 先在命令行执行
sbt clean,然后删除项目根目录下的target文件夹 - 清空IntelliJ缓存:
File -> Invalidate Caches / Restart,选择Invalidate and Restart - 手动删除本地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
相关产品推荐
相关产品推荐

