SBT 在发布到 Artifactory 时不传递凭据

SBT not passing credentials when publishing to Artifactory

我正在编写一个 Java 项目,我正在使用 SBT 自动构建和发布到 JFrog Artifactory。

每当需要发布到 Artifactory 时,我都想使用 Ivy 目录布局进行发布,并且显然将 Ivy XML 文件与 jar 一起发布。我设法通过在 build.sbt 文件中使用以下行来实现此目的:

crossPaths := false
publishTo := Some("Artifactory Realm" at "http://<Artifactory IP>:<Artifactory Port>/artifactory/org.project.my")
credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")
publishMavenStyle := false

然而,它仅在允许匿名用户部署到 Artifactory 时才有效。我意识到 sbt 并没有真正将我的凭据传递给 Artifactory,而是以匿名身份登录。

我的 $HOME/.ivy2/.credentials 文件如下所示:

realm=Artifactory Realm
host=http://<Artifactory IP>:<Artifactory Port>/artifactory/org.project.my
user=<my user name>
password=<my user name>

但是,如果我更改 Artifactory 配置以防止匿名用户部署新的 Artifacts,当我 运行 "sbt publish" 我得到以下输出:

[error] Unable to find credentials for [Artifactory Realm @ <Artifactory IP>].
java.io.IOException: Access to URL http://<Artifactory IP>:<Artifactory Port>/artifactory//org.project.my/org/project/my/project-my/1.0.0/project-my-1.0.0.jar was refused by the server: Unauthorized

Artifactory request.log 文件然后包含:

20160219011657|319|REQUEST|10.0.2.2|anonymous|PUT|/org.project.my/org/project/my/project-my/1.0.0/project-my-1.0.0.jar|HTTP/1.1|401|24978

我也尝试过手动传递凭据而不是使用文件:

credentials += Credentials("Artifactory Realm", "localhost", "<USERNAME>", "<PASS>")

但我得到了相同的结果。

知道我可能遗漏了什么吗?

尝试:

host=<Artifactory IP>

旧答案(无效):

host=<Artifactory IP>:<Artifactory port>

我有一个不同的问题:我在 .credentials 文件中设置了错误的 realm

查看 sbt 的错误输出,我发现我应该使用:

realm=Artifactory Realm

错误显示 realmhost 的预期值:

[error] Unable to find credentials for [Artifactory Realm @ myhost].