SBT打包WAR文件报错:重复条目META-INF/MANIFEST.MF
解决xsbt-web-plugin打包WAR时的META-INF/MANIFEST.MF重复错误
这个重复MANIFEST.MF的问题在使用xsbt-web-plugin打包WAR时挺常见的,我来帮你一步步排查和解决:
第一步:找出重复文件的来源
要解决问题,首先得明确到底有哪些地方生成或包含了这个重复的MANIFEST.MF:
- 执行
sbt "show packageBin::mappings"命令,这个会列出所有要打包到WAR里的文件及其源路径。直接搜索META-INF/MANIFEST.MF,就能看到所有重复的条目。 - 如果输出太多,可以用过滤命令简化:Linux/macOS用
sbt "show packageBin::mappings" | grep MANIFEST.MF,Windows在PowerShell里用sbt "show packageBin::mappings" | Select-String MANIFEST.MF。 - 另外检查你的项目中是否手动添加了
src/main/resources/META-INF/MANIFEST.MF,如果有,很大概率是它和sbt自动生成的MANIFEST冲突了。
第二步:针对性解决问题
根据排查出的原因,选择对应的解决方法:
情况1:手动MANIFEST和自动生成的冲突
如果你自己在项目里放了MANIFEST.MF,直接禁用sbt的自动生成即可:
// 指定使用你自己的MANIFEST文件 packageOptions += Package.Manifest(new File("src/main/resources/META-INF/MANIFEST.MF")) // 或者如果只是需要自定义属性,禁用默认生成后手动添加属性 packageOptions -= Package.ManifestAttributes() packageOptions += Package.ManifestAttributes( "Main-Class" -> "com.your.package.Main", "Implementation-Version" -> "1.2-SNAPSHOT" )
情况2:依赖jar里的MANIFEST被错误打包到WAR根目录
有时候某些依赖的MANIFEST会被意外提取到WAR的META-INF下,和项目生成的重复。可以通过过滤映射来排除重复的文件:
webappMappings ~= { mappings => mappings.filterNot { case (file, path) => // 替换成你从mappings里看到的重复文件的路径标识 path == "META-INF/MANIFEST.MF" && file.getAbsolutePath.contains("problematic-dependency.jar") } }
情况3:需要打Fat WAR(结合sbt-assembly)
如果你想把依赖直接打包到WEB-INF/classes而不是WEB-INF/lib,结合sbt-assembly时可以配置合并策略来丢弃重复的MANIFEST:
assemblyMergeStrategy in assembly := { case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard // 其他重复文件的合并策略,比如保留第一个出现的 case x => MergeStrategy.first }
之后用sbt assembly生成Fat WAR即可(注意确保xsbt-web-plugin和sbt-assembly版本兼容)。
情况4:依赖重复引入
有时候重复的MANIFEST来自重复引入的依赖,用sbt dependencyTree查看依赖树,找到重复的依赖后排除:
libraryDependencies += "com.example" % "your-dependency" % "1.0" exclude("org.unwanted", "duplicate-dep")
最后别忘了先执行sbt clean清空缓存,再重新打包,很多时候缓存文件也会导致这类重复问题。
内容的提问来源于stack exchange,提问作者Atais
相关产品推荐
相关产品推荐

