如何使用sbt访问安全的Nexus?

我试图访问需要一些基本authentication的Nexus存储库pipe理器。 从Maven2一切正常,但当我尝试在SBTconfiguration的东西,它找不到工件。 这是使用自定义存储库模式(见这个相关的问题 ),但我不认为这应该重要。 无论如何,相关configuration在这里。

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用户组中的类似讨论,这应该可以正常工作,但是当我尝试构build时,我正在获得以下内容。

 ==== 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(authentication后)。

我也尝试内联证书(即使它不是理想的),如下所示:

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

这就是我所做的(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)locking我的artifactory以禁用匿名访问。

3)在〜/ .sbt / .credentials中创build一个凭证文件

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

4)在〜/ .sbt / 0.13 / plugins / credentials.sbt下创build一个连接默认凭证的文件

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

现在当我的项目加载点击正常的artifactory。

我这样做的原因是为了让团队具有灵活性(他们可以设置一个内部服务器来处理正在进行的工件等),从而使存储库定义等不在项目文件中。

-Austen

更新:这个答案不适用于最近的版本 – 请参阅奥斯汀的答案。

好吧,我终于把这个整理出来了。

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

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

主机名称只是IP或DNS名称。 所以在.credentials host只是nexusHostIp没有端口号。

所以工作的Projectconfiguration是:

 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身份validation领域。

如果SBT启动程序无法从您的代理下载新版本的SBT,并且~/.sbt/boot/update.log显示您收到401validation错误,则可以使用环境variablesSBT_CREDENTIALS指定常春藤凭证文件是。

这些都应该工作,并下载新的版本:

  1. SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
  2. .bashrc (或export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials"中的export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials" ,启动一个新的shell会话,然后运行sbt

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

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

继SBT Documetation之后 :

有两种方式可以为这样的存储库指定凭证:

一致

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

外部文件

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

凭证文件是一个属性文件,其中包含域realm,主机,用户和密码。 例如:

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