使用sbt-assembly构建Scala胖Jar时遇org/pantsbuild#jarjar;1.6.5资源获取失败
结合你在Windows代理环境下用IntelliJ IDEA、Scala 2.12.4、sbt 1.1.1和Babun构建胖Jar时遇到的sbt-assembly失败问题,我整理了几个针对性的排查和解决方向,你可以逐一尝试:
解决sbt-assembly代理环境下构建失败的方案
1. 统一代理配置,覆盖所有环境
你同时用了Babun终端和IntelliJ的sbt,两边代理没对齐是常见的坑,得确保所有环境都用正确的代理:
- Babun终端配置:打开Babun,编辑
~/.bashrc或~/.zshrc文件,添加代理环境变量:
保存后执行export HTTP_PROXY=http://你的代理IP:端口 export HTTPS_PROXY=http://你的代理IP:端口 export NO_PROXY=localhost,127.0.0.1,你的内部域名source ~/.bashrc让配置生效。 - sbt全局代理配置:在Windows用户目录下找到
.sbt/1.0/repositories(sbt 1.1.x对应1.0版本目录),修改成带代理的仓库配置:[repositories] local maven-central: http://repo1.maven.org/maven2/, proxy=http://你的代理IP:端口 bintray-sbt-plugins: http://dl.bintray.com/sbt/sbt-plugin-releases, proxy=http://你的代理IP:端口 sonatype-releases: https://oss.sonatype.org/content/repositories/releases/, proxy=http://你的代理IP:端口 - IntelliJ IDEA的sbt代理:打开Settings → Build, Execution, Deployment → Build Tools → sbt,在VM options里添加:
-Dhttp.proxyHost=你的代理IP -Dhttp.proxyPort=端口 -Dhttps.proxyHost=你的代理IP -Dhttps.proxyPort=端口 -Dhttp.nonProxyHosts=localhost|127.0.0.1|*.你的内部域名
2. 补全sbt-assembly的插件配置
你提到的project/plugins.sbt里的sonatype仓库地址没写完整,正确的配置应该是:
resolvers += Resolver.url("bintray-sbt-plugins", url("http://dl.bintray.com/sbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns) resolvers += Resolver.sonatypeRepo("releases") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6")
另外,sbt 1.1.1和sbt-assembly 0.14.6版本是兼容的,如果后续还是有问题,可以尝试升级到sbt-assembly 0.14.10(更适配sbt 1.x的版本)。
3. 处理依赖冲突(胖Jar构建的高频问题)
如果代理没问题,大概率是依赖合并时的冲突导致失败。在你的build.sbt里添加合并策略:
assemblyMergeStrategy in assembly := { case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard // 丢弃重复的MANIFEST文件 case PathList("META-INF", xs @ _*) => MergeStrategy.first // 优先保留第一个找到的META-INF下的文件 case x => MergeStrategy.first // 其他文件都取第一个 }
如果有特定依赖的冲突(比如某个库的重复配置文件),可以单独指定策略,比如case "reference.conf" => MergeStrategy.concat。
4. 用Babun执行命令,查看详细日志
IntelliJ的sbt日志有时候会截断关键信息,切换到Babun终端,进入项目根目录,执行:
sbt -debug assembly
通过debug日志能精准定位问题:是代理下载依赖超时?还是合并Jar时某个文件重复?根据日志再针对性解决。
5. 验证代理能否访问插件仓库
在Babun里用curl测试代理是否能正常访问sbt-assembly的仓库:
curl -x http://你的代理IP:端口 http://dl.bintray.com/sbt/sbt-plugin-releases/com/eed3si9n/sbt-assembly_2.12_1.0/0.14.6/
如果能正常返回仓库页面,说明代理配置没问题;如果超时或报错,那就是代理的网络权限问题,得联系运维调整。
内容的提问来源于stack exchange,提问作者ajmnsk
相关产品推荐
相关产品推荐

