49

我正在尝试访问需要一些基本身份验证的 Nexus 存储库管理器。Maven2 一切正常,但是当我尝试在 SBT 中配置内容时,它找不到工件。它正在使用自定义存储库模式(请参阅此相关问题),但我认为这无关紧要。无论如何,相关配置都在这里。

项目.scala:

val snapshotsName = "Repository Snapshots"
val snapshotsUrl = new java.net.URL("http://nexusHostIp:8081/nexus/content/repositories/snapshots")
val snapshotsPattern = "[organisation]/[module]/[revision]-SNAPSHOT/[artifact]-[revision](-[timestamp]).[ext]"
val snapshots = Resolver.url(snapshotsName, snapshotsUrl)(Patterns(snapshotsPattern))
Credentials(Path.userHome / ".ivy2" / ".credentials", log)

val dep = "group" % "artifact" % "0.0.1" extra("timestamp" -> "20101202.195418-3")

~/.ivy2/.credentials:

realm=Snapshots Nexus
host=nexusHostIp:8081
user=nexususername
password=nexuspassword

根据SBT 用户组中的类似讨论,这应该可以正常工作,但是当我尝试构建时,我得到了以下信息。

==== Repository Snapshots: tried
[warn]    -- artifact group#artifact;0.0.1!artifact.jar:
[warn]    http://nexusHostIp:8081/nexus/content/repositories/snapshots/group/artifact/0.0.1-SNAPSHOT/artifact-0.0.1-20101202.195418-3.jar

我相当确定这是一个凭据问题,而不是其他问题,因为我可以点击它说它正在尝试的 URL 并下载 jar(在身份验证之后)。

我也尝试过像这样声明内联凭据(即使它不太理想):

Credentials.add("Repository Snapshots", "nexusHostIp", "nexususername", "nexuspassword")
4

6 回答 6

84

这是我所做的(sbt 0.13 + artifactory - nexus 的设置应该类似):

1)编辑文件 ~/.sbt/repositories 在这里指定:http ://www.scala-sbt.org/0.13.0/docs/Detailed-Topics/Proxy-Repositories.html

[repositories]
  local
  my-ivy-proxy-releases: http://repo.company.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  my-maven-proxy-releases: http://repo.company.com/maven-releases/

2) 锁定我的神器以禁用匿名访问。

3) 在 ~/.sbt/.credentials 中创建了一个凭证文件

realm=Artifactory Realm
host=artifactory.mycompany.com
user=username
password=password

4) 在 ~/.sbt/0.13/plugins/credentials.sbt 下创建了一个文件,用于连接默认凭据

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

现在,当我的项目加载时,sbt 像往常一样命中工件。

我这样做的原因是将存储库定义等保留在项目文件之外,以使团队具有灵活性(他们可以设置内部服务器来提供正在进行的工件等)。

-奥斯汀

于 2013-10-25T19:56:49.877 回答
35

更新:这个答案在最近的 sbt 版本中不起作用 - 请参阅奥斯汀的答案。

好吧,我终于解决了这个问题。

snapshotsName可以是任何东西。realmin .credentials 必须是在尝试访问存储库的 URL 时显示的 HTTP 身份验证领域(在我的例子中是 nexus)。realm也是 的第一个参数Credentials.add。所以那条线应该是

Credentials.add("Sonatype Nexus Repository Manager", "nexusHostIp", "nexususername", "nexuspassword")

主机名只是 ip 或 DNS 名称。所以在 .credentialshost中只是nexusHostIp没有端口号。

所以工作的项目配置是:

val snapshotsName = "Repository Snapshots"
val snapshotsUrl = new java.net.URL("http://nexusHostIp:8081/nexus/content/repositories/snapshots")
val snapshotsPattern = "[organisation]/[module]/[revision]-SNAPSHOT/[artifact]-[revision](-[timestamp]).[ext]"
val snapshots = Resolver.url(snapshotsName, snapshotsUrl)(Patterns(snapshotsPattern))
Credentials(Path.userHome / ".ivy2" / ".credentials", log)

val dep = "group" % "artifact" % "0.0.1" extra("timestamp" -> "20101202.195418-3")

使用如下所示的 .credentials 文件:

realm=Sonatype Nexus Repository Manager
host=nexusHostIp
user=nexususername
password=nexuspassword

其中“Sonatype Nexus Repository Manager”是 HTTP 身份验证领域。

于 2010-12-04T00:43:53.543 回答
6

根据SBT 文档

有两种方法可以为此类存储库指定凭据:

排队

credentials += Credentials("Some Nexus Repository Manager", "my.artifact.repo.net", "admin", "password123")

外部文件

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

.credentials文件是一个属性文件,其中包含密钥领域、主机、用户和密码。例如:

realm=Some Nexus Repository Manager
host=my.artifact.repo.net
user=admin
password=password123
于 2016-06-02T17:19:48.997 回答
5

如果 SBT 启动器无法从您的代理下载新版本的 SBT,这~/.sbt/boot/update.log表明您遇到 401 身份验证错误,您可以使用环境变量 SBT_CREDENTIALS 来指定 ivy 凭证文件的位置。

这些中的任何一个都应该可以工作并下载新的 sbt 版本:

  1. SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
  2. 放入export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials"您的.bashrc(或.zshrc),开始一个新的 shell 会话,然后运行sbt

(您需要~/.ivy2/.credentials像此处显示的其他答案一样进行文件设置)

来源:https ://github.com/sbt/sbt/commit/96e5a7957c830430f85b6b89d7bbe07824ebfc4b

于 2016-10-28T07:09:27.083 回答
2

这对我有用。我正在使用 SBT 0.13.15 版:

~/.ivy2/.my-credentials(没有端口的主机):

realm=Sonatype Nexus Repository Manager
host=mynexus.mycompany.com
user=my_user
password=my_password

build.sbt(带有端口的链接 url):

import sbt.Credentials

...

credentials += Credentials(Path.userHome / ".ivy2" / ".my-credentials")

...

resolvers in ThisBuild ++= Seq(
    MavenRepository("my-company-nexus", "https://mynexus.mycompany.com:8081/repository/maven-releases/")
)
于 2017-11-01T15:56:12.417 回答
2

检查所有包含凭据的文件。

对我来说,我在 sbt 1.0(而不是旧的 0.13)中有一个新项目,其中有一个~/.sbt/1.0/global.sbt包含我的凭据的文件,但我忘记了。因此,在强制更改密码后,神器下载被破坏并锁定了我的帐户。

如果可以轻松检查凭据链和填充它们的文件,那就太好了。如果 SBT 更加小心并首先检查身份验证/授权是否正确,然后开始下载 X 文件并在 3 次错误身份验证尝试后锁定我的帐户,那也会很好。

于 2018-06-05T11:47:22.880 回答