如何使用sbt访问受保护的Nexus?

时间:2010-12-03 18:49:34

标签: sbt ivy nexus

我正在尝试访问需要一些基本身份验证的Nexus存储库管理器。从Maven2开始,一切正常,但是当我尝试在SBT中配置时,它找不到工件。它使用自定义存储库模式(请参阅this related question),但我认为这不重要。在任何情况下,相关配置都在这里。

Project.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

根据a similar discussion in the SBT user group,这应该可以正常工作但我在尝试构建时会得到以下内容。

==== 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")

6 个答案:

答案 0 :(得分:69)

这就是我所做的(sbt 0.13 + artifactory - setup应该与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时会像平常一样点击神器。

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

-Austen

答案 1 :(得分:33)

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

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

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

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

主机名只是ip或DNS名称。因此,.credentials host只是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身份验证领域。

答案 2 :(得分:5)

如果SBT启动程序无法从您的代理下载新版本的SBT,并且~/.sbt/boot/update.log显示您正在获得401身份验证错误,则可以使用环境变量SBT_CREDENTIALS指定常春藤凭证文件是。

其中任何一个都应该可以工作并下载新的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
  3. (您需要设置~/.ivy2/.credentials文件设置,就像此处显示的其他答案一样)

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

答案 3 :(得分:4)

关注SBT Documetation

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

内联

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

外部文件

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

凭证文件是包含密钥领域,主机,用户和密码的属性文件。例如:

realm=Some Nexus Repository Manager
host=my.artifact.repo.net
user=admin
password=password123

答案 4 :(得分:1)

这对我有用。我使用的是SBT版本0.13.15:

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

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

build.sbt(带端口的nexus网址):

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/")
)

答案 5 :(得分:1)

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

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

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