尝试从 Artifactory 虚拟存储库下载时,SBT 无法找到凭据
Posted
技术标签:
【中文标题】尝试从 Artifactory 虚拟存储库下载时,SBT 无法找到凭据【英文标题】:SBT is unable to find credentials when attempting to download from an Artifactory virtual repo 【发布时间】:2017-03-06 14:45:05 【问题描述】:我正在尝试在公司防火墙后面运行 SBT。另一个团队配置了 Artifactory 代理。这个代理在开启匿名访问的情况下可以正常工作,但是当我们让它需要密码时就会开始出错。
当我在我的工作站上运行 SBT 时,我收到以下错误:
[error] Unable to find credentials for [Artifactory Realm @ coderepo.xxx.amrs.bigco.com]
这样做的结果是我无法引导 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] ::::::::::::::::::::::::::::::::::::::::::::::
我尝试将 .credentials 文件放入 ~/.sbt 和 ~/.ivy2:我一直在测试以下变体,所有这些都不起作用:
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
这些似乎都没有任何影响。
那么,允许 SBT 使用用户名和密码对受密码保护的 Artifactory 存储库进行身份验证的正确方法是什么?
UPDATE0:根据 Ivy 文档,最有可能的领域名称就是“Artifactory Realm”。根据 SBT 文档,凭据文件的正确默认位置应该是 %USERPROFILE%/.sbt/.credentials(是的,我使用的是 Windows)。即使删除了我的 .ivy2 目录中的 .credentials 文件,它仍然无法正常工作。
UPDATE1:相关但实际上没有帮助:
SBT not passing credentials when publishing to Artifactory Sbt can't authorize in ArtifactoryUPDATE2:我开始怀疑这是 sbt 中的错误 - 我在这里添加了一个问题:https://github.com/sbt/sbt/issues/2817
【问题讨论】:
【参考方案1】:有关如何配置全局凭据的详细信息,请参阅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")
【讨论】:
export SBT_CREDENTIALS=some_credentials; sbt publish
还不够。您需要的是 1) credentials += Credentials(file("some_credentials"))
in build.sbt
。或 2) credentials += Credentials(Path.userHome / ".sbt" / ".credentials")
in ~/.sbt/1.0/plugins/credentials.sbt
@prayagupd 哦,你真的救了我!所有的文档都是错误的。
@ViktorHedefalk 很高兴为您提供帮助。这也可能会有所帮助publish a scala app with credentials?
我遇到了同样的问题,并且在 1.0 文件夹中丢失了 credentials.sbt。【参考方案2】:
我认为这个文件的默认位置是$HOME/.sbt/<sbt-version>/.credentials
;虽然我相信有关于此的已发布文档,但我通过单击代码确认了这一点。
@salim-fadhley,看起来您在路径中缺少 SBT 版本。
编辑:您需要将
DefaultOptions.addCredentials
添加到您的build.sbt;然后,您可以使用show credentials
验证 SBT 接收到的内容。
撇开文件位置不谈,存储库名称(无意义)与安全领域(无意义)之间似乎存在混淆。
从存储库服务器返回的 auth-challenge 将包含 安全领域的名称;作为客户/开发人员,您无法控制它是什么,我猜它必须与您(客户/开发人员)在.credentials
文件中指定的领域匹配(无论是什么地方)。
同时,存储库名称(如 build.sbt
中的特色)实际上对相应项目开发之外的任何人都没有任何意义,例如存储库服务器管理员不在乎从一个项目到下一个项目。
【讨论】:
【参考方案3】:关于环境的细节 -
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")
【讨论】:
以上是关于尝试从 Artifactory 虚拟存储库下载时,SBT 无法找到凭据的主要内容,如果未能解决你的问题,请参考以下文章