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

SBT is unable to find credentials when attempting to download from an Artifactory virtual repo

我正在尝试 运行 在公司防火墙后面进行 SBT。另一个团队配置了一个 Artifactory 代理。此代理在匿名访问打开时工作正常,但当我们让它需要密码时,认为开始出错。

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

[error] Unable to find credentials for [Artifactory Realm @ coderepo.xxx.amrs.bigco.com]

结果是我不能 bootstrap 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]  ::::::::::::::::::::::::::::::::::::::::::::::

我试过在 ~/.sbt 和 ~/.ivy2 中放置一个 .credentials 文件:我一直在测试以下变体,所有这些都不起作用:

realm=Artifactory Realm @ coderepo.xxx.amrs.bigco.com
host=coderepo.xxx.amrs.bigco.com
user=<username>
password=<pwd>

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

realm=Artifactory Realm
realm=[Artifactory Realm @ coderepo.xxx.amrs.bigco.com]
realm=coderepo.xxx.amrs.bigco.com

None 其中似乎没有任何影响。

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

UPDATE0:根据 Ivy 文档,最有可能的域名就是 "Artifactory Realm"。根据 SBT 文档,凭证文件的正确默认位置应该是 %USERPROFILE%/.sbt/.credentials(是的,我正在使用 Windows)。即使删除了我的 .ivy2 目录中的 .credentials 文件,它仍然不起作用。

UPDATE1:相关但实际上没有帮助:

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

有关如何配置全局凭据的详细信息,请参阅 this question

总结一下:

如果您需要从代理存储库启动 SBT,请将系统 属性 sbt.boot.credentials 设置为指向您的凭据文件。您可以在 %CSIDL_PROGRAM_FILESX86%/sbt/conf/sbtconfig.txt 中执行此操作,例如:

-Dsbt.boot.credentials=/Users/my-user-name/.sbt/credentials

或者,您可以使用 SBT_CREDENTIALS 环境变量来达到同样的目的。

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

realm=Artifactory Realm

为了验证依赖项工件检索,创建一个类似 %USERPROFILE%/.sbt/0.13/plugins/my-credentials.sbt 的文件并设置 credentials。例如:

credentials += Credentials(Path.userHome / ".sbt" / "credentials")

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

EDIT: You need to add DefaultOptions.addCredentials to your build.sbt; you can then verify what SBT picks up with show credentials.

撇开文件位置不谈,存储库名称(毫无意义)与安全领域(意味着一切)之间似乎存在混淆。

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

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

环境详情-

Operating System - MacOS Catalina
    
exampleUser@exampleUser-mbp-2 plugins % sbt -version
sbt version in this project: 1.4.7
sbt script version: 1.4.7
    
exampleUser@exampleUser-mbp-2 plugins % scala -version
Scala code runner version 2.11.12 -- Copyright 2002-2017, LAMP/EPFL

用户HOME目录-

exampleUser@exampleUser-mbp-2 plugins % echo $HOME
/Users/exampleUser

credentials.sbt 文件的位置 - $HOME/.sbt/1.0/plugins

.credentials 文件存储 username/password 组合并被 Artifactory 用于验证。 我们应该在credentials.sbt文件中输入.credentials文件的位置。

示例条目如下-

exampleUser-mbp-2:plugins exampleUser$ cat $HOME/.sbt/1.0/plugins/credentials.sbt 
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")