尝试从Artifactory虚拟仓库下载时,SBT无法找到凭据

Sal*_*ley 9 scala artifactory sbt

我正试图在公司防火墙后面运行SBT.另一个团队配置了Artifactory代理.这个代理可以正常启用匿名访问,但是当我们让它需要密码时,认为开始出错了.

当我在工作站上运行SBT时,出现以下错误:

[error] Unable to find credentials for [Artifactory Realm @ coderepo.xxx.amrs.bigco.com]
Run Code Online (Sandbox Code Playgroud)

结果是我无法引导sbt:

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: org.scala-lang#scala-library;2.10.6: not found
[warn]  :: org.scala-sbt#sbt;0.13.12: not found
[warn]  :: org.scala-lang#scala-compiler;2.10.6: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
Run Code Online (Sandbox Code Playgroud)

我已经尝试在./ .sbt和〜/ .ivy2中放置一个.credentials文件:我一直在测试以下内容的变体,所有这些都不起作用:

realm=Artifactory Realm @ coderepo.xxx.amrs.bigco.com
host=coderepo.xxx.amrs.bigco.com
user=<username>
password=<pwd>
Run Code Online (Sandbox Code Playgroud)

我猜这个错误意味着它无法找到与领域匹配的凭据定义,所以我在两个位置尝试了第一行的多个版本:

realm=Artifactory Realm
realm=[Artifactory Realm @ coderepo.xxx.amrs.bigco.com]
realm=coderepo.xxx.amrs.bigco.com
Run Code Online (Sandbox Code Playgroud)

这些似乎都没有任何影响.

那么,允许SBT使用用户名和密码对受密码保护的Artifactory存储库进行身份验证的正确方法是什么?

UPDATE0:根据常春藤文档,最可能的领域名称只是"Artifactory Realm".根据SBT文档,凭证文件的正确默认位置应为%USERPROFILE%/.sbt/.credentials(是的,我使用的是Windows).即使在删除.ivy2目录中的.credentials文件后,它仍然无效.

更新1:相关但实际上并没有帮助:

UPDATE2:我开始怀疑这是sbt中的一个错误 - 我在这里添加了一个问题:https://github.com/sbt/sbt/issues/2817

小智 13

有关如何配置全局凭据的详细信息,请参阅此问题.

总结一下:

如果需要从代理存储库启动SBT,请将系统属性设置sbt.boot.credentials为指向您的凭据文件.你可以在你的身上做到这一点%CSIDL_PROGRAM_FILESX86%/sbt/conf/sbtconfig.txt,例如:

-Dsbt.boot.credentials=/Users/my-user-name/.sbt/credentials
Run Code Online (Sandbox Code Playgroud)

或者,您可以将SBT_CREDENTIALS环境变量用于相同的目的.

对于Artifactory,credentials文件中的域应设置为:

realm=Artifactory Realm
Run Code Online (Sandbox Code Playgroud)

为了验证依赖构件的检索,创建一个文件像%USERPROFILE%/.sbt/0.13/plugins/my-credentials.sbt一个credentials设置.例如:

credentials += Credentials(Path.userHome / ".sbt" / "credentials")
Run Code Online (Sandbox Code Playgroud)

  • `出口SBT_CREDENTIALS=some_credentials; sbt publish` 是不够的。你需要的是`build.sbt`中的**1)** `credentials += Credentials(file("some_credentials"))`。或 **2)** `credentials += Credentials(Path.userHome / ".sbt" / ".credentials")` 在 `~/.sbt/1.0/plugins/credentials.sbt` 中 (3认同)

Dar*_*hop 5

我认为该文件的默认位置是${HOME}/.sbt/<sbt-version>/.credentials;虽然我相信已经发布了相关文档,但我通过在代码中单击来确认这一点。
@salim-fadhley,看起来您在路径中缺少 SBT 版本。

编辑:您需要添加DefaultOptions.addCredentials到您的 build.sbt; 然后您可以验证 SBT 拾取的内容show credentials

除了文件位置之外,存储库名称(没有任何意义)与安全领域(意味着一切)之间似乎存在混淆。

从存储库服务器返回的身份验证挑战将包括安全领域的名称;作为客户/开发人员,您无法控制它是什么,我的猜测是它必须与您(客户/开发人员)在文件中指定的领域.credentials(无论在哪里)相匹配。

同时,存储库名称(如 中所示build.sbt)实际上对于相应项目开发之外的任何人都没有任何意义,例如存储库服务器管理员无法关心从一个项目到下一个项目。