SBT添加assembly构件后未向Nexus发送Authorization头问题
我之前碰到过几乎一模一样的场景,你的问题核心在于用addArtifact自定义发布任务时,这个新创建的任务并没有自动继承全局配置的Nexus凭证,导致请求Nexus时完全没携带Authorization头,最终上传失败。
问题拆解
- 当你添加
addArtifact(artifact in (Compile, assembly), assembly)时,sbt会生成一个独立的发布任务,这个任务默认不会复用你全局配置的credentials信息; - 移除
addArtifact后,sbt走默认的发布流程,这个流程会自动读取并携带你配置的凭证,所以抓包能看到Authorization头,上传自然成功; - 手动用Postman上传时,你是手动指定了凭证信息,所以也能顺利完成上传。
可行解决方案
你可以通过两种方式来修复这个问题:
方案1:显式为assembly任务关联凭证
修改你的sbt配置,让assembly任务的凭证直接继承全局配置的凭证,确保新发布任务能拿到授权信息:
artifact in (Compile, assembly) := { val art = (artifact in (Compile, assembly)).value art.withClassifier(Some("assembly")) } // 显式让assembly任务继承全局凭证配置 credentials in (Compile, assembly) := credentials.value addArtifact(artifact in (Compile, assembly), assembly)
方案2:将assembly产物加入默认发布流程
如果你不想依赖addArtifact,可以直接把fat jar加入到默认的发布映射里,复用默认发布流程的凭证逻辑:
assembly / artifact := { val art = (assembly / artifact).value art.withClassifier(Some("assembly")) } // 将assembly的fat jar添加到默认发布的文件映射中 Compile / publishMappings ++= Seq( (assembly.value, artifactPath.in(Compile, assembly).value.getName) )
验证方式
修改配置后重新执行sbt publish,再抓包就能看到请求Nexus时已经携带了Authorization头,fat jar应该能正常上传到你的Nexus仓库了。
内容的提问来源于stack exchange,提问作者amorfis
相关产品推荐
相关产品推荐

