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

SBT添加assembly构件后未向Nexus发送Authorization头问题

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:37:52