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

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

根据 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

我可以肯定的是,这是一个凭证问题,而不是其他问题,因为我可以点击它直接尝试并下载JAR(在身份验证后)的URL。

我还曾尝试宣布凭证内联(即使它不太理想)这样:

Credentials.add("Repository Snapshots", "nexusHostIp", "nexususername", "nexuspassword")
有帮助吗?

解决方案

这是我所做的(SBT 0.13 +伪像 - 设置对于Nexus应该相似):

1)按照此处指定的编辑文件〜/.sbt/存储库: 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/插件/凭证下创建一个文件

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

现在,当我的项目加载SBT时,SBT像正常人一样击中伪像。

我这样做的原因是要将存储库定义等等放在项目文件之外,以使团队具有灵活性(他们可以设置内部服务器以服务于过程中的工件等)。

- 奥斯滕

其他提示

更新:此答案在最近的SBT版本中不起作用 - 而是请参见Austen的答案。

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

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

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

主机名只是IP或DNS名称。因此 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存储库管理器”是HTTP身份验证领域。

如果SBT启动器未能从您的代理下载新版本的SBT,那 ~/.sbt/boot/update.log 正在显示您遇到了401个身份验证错误,您可以使用环境变量SBT_CREDENTICES来指定IVY凭据文件在哪里。

其中的任何一个都应该使用并下载新的SBT版本:

  1. SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
  2. 推杆 export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials" 在你的 .bashrc (或者 .zshrc),开始新的外壳会话然后运行 sbt

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

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

跟随 SBT文档:

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

排队

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

这对我有用。我正在使用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 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/")
)

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top