如何获取sbt以使用本地Maven代理存储库(Nexus)?


73

我有一个sbt(Scala)项目,当前该项目从网络上提取工件。我们希望转向可缓存工件的公司标准化Nexus存储库。从Nexus文档中,我了解了如何对Maven项目执行此操作。但是sbt显然使用了不同的方法。(我了解常春藤以某种方式参与其中,但我从未使用过它,也不了解它是如何工作的。)

如何告诉sbt和/或底层Ivy对所有依赖项使用公司Nexus存储库系统?我想答案是使用某种项目级别的配置文件,以便源存储库的新克隆将自动使用代理。(即,在点目录中处理每个用户的配置文件是不可行的。)

谢谢!


@VonC我用[maven]标记对问题做了一些大的更新,并认为这是关于Nexus而不是Maven(-2)的问题。但是,如果您认为这很重要,请随意回滚/更新,那么我可能对此做得太快了。
Pascal Thivent 2010年

是的,Maven可能不是主要标签,但肯定与Maven回购有关。我回滚了。
哈兰2010年

顺便说一句,可以肯定的是:它无论是在家里还是在工作中,都可以像宣传的那样工作。我已经编辑了我的问题以说明问题,并添加了一些存储库定义供您检查。
VonC 2010年

Answers:


34

步骤1:按照“详细主题:代理存储库”中的说明进行操作,我对其进行了总结并添加到以下内容:

  1. (如果使用的是Artifactory,则可以跳过此步骤。)在公司Maven存储库上创建一个完全独立的Maven代理存储库(或组),以代理诸如以下两个重要的ivy风格的存储库:

    这是必需的,因为某些存储库管理器无法处理混合在一起的Ivy风格的存储库和Maven风格的存储库。

  2. 创建一个文件repositories,列出您的主要公司存储库以及您在步骤1中创建的任何其他文件,格式如下所示:

    [repositories]
      my-maven-proxy-releases: http://repo.example.com/maven-releases/
      my-ivy-proxy-releases: http://repo.example.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
    
  3. 将该文件保存在主.sbt目录内的目录中,或者在sbt命令行上指定它:

    sbt -Dsbt.repository.config=<path-to-your-repo-file>
    

对于使用旧版本sbt的用户来说是个好消息:即使至少在sbt 0.12.0启动器jar中,旧sbt版本的启动属性文件不包含必需的行(提到的那一行repository.config),它仍然可以工作对于这些版本的sbt,如果您编辑这些文件以添加所需的行,然后将它们重新打包到sbt 0.12.0启动器jar中,则为它们!这是因为该功能是在启动器中实现的,而不是在sbt中实现的。据说sbt 0.12.0启动器能够启动所有版本的sbt,从0.7开始!

步骤2:为确保不使用外部存储库,请从解析器中删除默认存储库。可以通过以下两种方式之一来完成此操作:

  1. 添加-Dsbt.override.build.repos=true上面“详细主题”页面上提到的命令行选项。这将导致您在文件中指定的存储库覆盖在任何sbt文件中指定的任何存储库。但是,这可能仅在sbt 0.12及更高版本中有效-我尚未尝试过。
  2. 在构建文件中,fullResolvers := Seq( 对公司Maven存储库 使用解析程序),而不要使用resolvers ++=或使用过的解析器resolvers :=

1
我正在使用Scala 2.10,Artifactory 3,sbt 12.3,并且使用此处以及此处引用的文档中的说明没有运气。在那儿找到打字机后,我知道它的阅读库。我已经通过-D在启动器上设置了属性。SBT的行为就像它不忽略默认解析器一样,它说应该使用-Dsbt.override.build.repos = true。我可以尝试上面的第二点,但是听起来好像不是必须的?
龙猫

1
@Robin Green:非常感谢,这个问题使我发疯,您的解决方案对我有用。
Grundlefleck 2013年

3
如果要针对每个项目配置此项目(如原始问题中所述),并且不想在每次sbt运行中都添加命令行选项,则可以在“ build.sbt”旁边创建一个名为“ .sbtopts”的文件。将选项(-Dsbt.override.build.repos=true -Dsbt.repository.config=<…>)放入其中,它们将被sbt可执行文件拾取。
F30

12

好的,在sbt邮件列表上的Mark Harrah的帮助下,我有一个有效的答案。

现在,我的构建类如下所示(加上一些其他存储库):

import sbt._

//By extending DefaultWebProject, we get Jetty support
class OurApplication(info: ProjectInfo) extends DefaultWebProject(info) {

  // This skips adding the default repositories and only uses the ones you added
  // explicitly. --Mark Harrah
  override def repositories = Set("OurNexus" at "http://our.nexus.server:9001/nexus/content/groups/public/") 
  override def ivyRepositories = Seq(Resolver.defaultLocal(None)) ++ repositories

  /* Squeryl */
  val squeryl = "org.squeryl" % "squeryl_2.8.0.RC3" % "0.9.4beta5"

  /* DATE4J */
  val date4j = "hirondelle.date4j" % "date4j" % "1.0" from "http://www.date4j.net/date4j.jar"

  // etc
}

现在,如果我从计算机.ivy2/cache目录中删除Squeryl树,则sbt会尝试使用适当的URL从Nexus树中获取它。问题解决了!


6
现在对于Play 2 Final和SBT 0.11.2已经过时了。
delitescere'4

9

您需要定义一个属性文件sbt.boot.properties,该文件将使您能够:

    C:\ HOMEWARE \ apps \ sbt-0.74 \ sbt.boot.properties

    [斯卡拉]
      版本:2.7.7
    #分类器:来源,javadoc

    [app]
      org:org.scala-tools.sbt
      名称:sbt
      版本:read(sbt.version)
      类:sbt.xMain
      组件:xsbti
      交叉版本:true
      分类器:来源,javadoc

    [储存库]
      本地
      my-nexus:http://my.nexus/nexus/content/repositories/scala-tools/,[组织] / [模块] / [修订] / [类型] s / [工件](-[分类器])。 [ext]
      Maven本地
    #sbt-db:http://databinder.net/repo/,[组织] / [模块] / [修订] / [类型] s / [工件](-[分类器])。[ext]
    #maven-central
    #scala-tools-releases
    #scala-tools-snapshots

    [启动]
     目录:项目/启动
     属性:project / build.properties
     提示创建:项目不存在,创建新项目?
     提示填充:true
     快速选项:true

    [日志]
     级别:调试

    [应用程序属性]
     project.name:quick = set(测试),new = prompt(名称)[p],fill = prompt(名称)
     project.organization:new = prompt(Organization)[org.vonc]
     project.version:quick = set(1.0),new = prompt(版本)[1.0],fill = prompt(版本)[1.0]
     build.scala.versions:quick = set(2.8.0.RC2),new = prompt(Scala版本)[2.8.0.RC2],fill = prompt(Scala版本)[2.8.0.RC2]
     sbt.version:quick = set(0.7.4),new = prompt(sbt版本)[0.7.4],fill = prompt(sbt版本)[0.7.4]
     project.scratch:quick = set(true)
     project.initialize:quick = set(true),new = set(true)

    [常春藤]
     缓存目录:C:\ HOMEWARE \ projects \ .ivy2 \ cache

注意:此sbt.boot.properties文件的灵感来自:

我已经评论了任何外部Maven存储库定义,并添加了对我自己的Nexus Maven存储库的引用。

可以通过以下方式之一以较高的优先级顺序配置启动器:

  • 替换中的/sbt/sbt.boot.properties文件jar
  • 将名为配置文件的文件sbt.boot.properties放在类路径上。将其放在没有/sbt前缀的classpath根目录中。
  • 在命令行上指定备用配置的位置。这可以通过以下方式完成:
    • 将位置指定为系统属性 sbt.boot.properties
    • 或作为以“ @”为前缀的启动器的第一个参数。

系统属性的优先级较低。
相对路径的分辨率为:

  • 首先尝试针对当前工作目录,
  • 然后针对用户的主目录,
  • 然后针对包含启动程序jar的目录。

如果这些尝试均未成功,则会生成一个错误。


定义sbt.bat包装(为了确保指定 sbt.boot.properties),如:

C:\HOMEWARE>more C:\HOMEWARE\bin\sbt.BAT
@echo off
set t=%~dp0
set adp0=%t:C:\="%"

set SBT_DIR=%adp0%..\apps\sbt-0.74
dir C:\%SBT_DIR%\sbt-launch-0.7.4.jar
# if needed, add your proxy settings
set PROXY_OPTIONS=-Dhttp.proxyHost=my.proxy -Dhttp.proxyPort=80xx -Dhttp.proxyUser=auser -Dhttp.proxyPassword=yyyy
set JAVA_OPTIONS=-XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -cp C:\HOMEWARE\apps\sbt-0.74\sbt-launch-0.7.4
set SBT_BOOT_PROPERTIES=-Dsbt.boot.properties="sbt.boot.properties"
cmd /C C:\HOMEWARE\apps\jdk4eclipse\bin\java.exe %PROXY_OPTIONS% %JAVA_OPTIONS% %SBT_BOOT_PROPERTIES% -jar C:\HOMEWARE\apps\sbt-0.74\sbt-launch-0.7.4.jar %*

和你的SBT会下载神器从:

  • 你的Nexus
  • 您当地的Maven回购。

刚在家里用我运行的旧Nexus开源1.6测试过,Java 1.6,sbt07.4

C:\Prog\Java\jdk1.6.0_18\jre\bin\java  -Xmx512M -Dsbt.boot.properties=sbt.boot.properties - jar "c:\Prog\Scala\sbt\sbt-launch-0.7.4.jar"  

这给出了:

[success] Build completed successfully.
C:\Prog\Scala\tests\pp>sbt
Getting Scala 2.8.0 ...
downloading http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.8.0/scala-compiler-2.
8.0.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-compiler;2.8.0!scala-compiler.jar (311ms)
downloading http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-library/2.8.0/scala-library-2.8.
0.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-library;2.8.0!scala-library.jar (185ms)
:: retrieving :: org.scala-tools.sbt#boot-scala
        confs: [default]
        2 artifacts copied, 0 already retrieved (14484kB/167ms)
[info] Building project test 0.1 against Scala 2.8.0
[info]    using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7

如果我在sbt.boot.properties文件中尝试一个有趣的值:

C:\Prog\Scala\tests\pp>sbt
Getting Scala 2.9.7 ...

:: problems summary ::
:::: WARNINGS
                module not found: org.scala-lang#scala-compiler;2.9.7
        ==== nexus: tried
          http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.9.7/scala-compiler-2.9.7.pom
          -- artifact org.scala-lang#scala-compiler;2.9.7!scala-compiler.jar:
          http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.9.7/scala-compiler-2.9.7.jar

因此它确实将自身限制为我定义的两个仓库:

[repositories]
nexus:  http://localhost:8081/nexus/content/repositories/scala
nexus2: http://localhost:8081/nexus/content/repositories/scala, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]

(我评论的一切:localmaven-local,...)

如果我注释所有存储库并在中为scala版本添加一个有趣的值(2.7.9)sbt.boot.properties,我会得到(就像OP一样)

C:\Prog\Scala\tests\pp>sbt
Error during sbt execution: No repositories defined.

如果我输入2.7.7(同时仍在所有回购中添加注释),是的,它不会产生错误:

C:\Prog\Scala\tests\pp>sbt
[info] Building project test 0.1 against Scala 2.8.0
[info]    using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7

但这仅仅是因为它在我之前的尝试中已经下载了scala2.8.0。
如果我从project/boot目录中删除该库,则它将引发异常:

[info]    using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7
> C:\Prog\Scala\tests\pp>sbt
Error during sbt execution: No repositories defined.
        at xsbt.boot.Pre$.error(Pre.scala:18)
        at xsbt.boot.Update.addResolvers(Update.scala:197)
...
        at xsbt.boot.Boot$.main(Boot.scala:15)
        at xsbt.boot.Boot.main(Boot.scala)
Error loading project: Error during sbt execution: No repositories defined.

非常感谢您的完整答复!但这对我不起作用。我创建了一个sbt.boot.properties文件,它只列出了三个存储库:local,maven-local和my-nexus,它们指向我们的本地Nexus存储库。sbt是具有以下内容的脚本:java -Xmx1024M -Dsbt.boot.properties="sbt.boot.properties" -jar dirname $ 0/sbt-launch.jar "$@"如果我随后从.ivy2缓存中删除软件包(例如Squeryl),然后执行“ sbt update”,则它似乎是从公共Internet拉出的,而没有涉及我们的Nexus安装。怎么/为什么?
哈兰2010年

@哈伦:为什么?因为它不会考虑您的sbt.boot.properties。您是否在旁边创建了它sbt-launch-0.7.4.jar(意思是在您的类路径中)?想一想,我没有在您的java命令中明确定义任何类路径。
VonC 2010年

肯定是在加载sbt.boot.properties。使用上面显示的命令,如果我在该文件中将Scala版本更改为2.9.7,它将徒劳地尝试获取2.9.7。因此,这不是类路径问题。但是sbt update,即使仅定义了本地和my-nexus,也从scala-tools.org中提取了信息。
哈兰2010年

@Harlan:您是否尝试没有定义存储库?还是要定义明显是假的东西?我仍然很难相信您的特定属性文件已被考虑在内。
VonC

真奇怪 如果我将scala版本设置为2.9.7,并注释掉所有存储库,则它将处理“ sbt执行期间出错:未定义存储库”。但是,如果我将scala版本设置为2.7.7,并注释掉所有存储库,那么它会阻塞并且似乎会忽略存储库列表!
哈兰2010年

6

编辑sbt_home / conf中的配置文件“ sbtconfig.txt”

加两行

-Dsbt.override.build.repos=true
-Dsbt.repository.config="C:/Program Files (x86)/sbt/conf/repo.properties"

repo.properties的内容是

[repositories]
    local
    public: http://222.vvfox.com/public  <-fix this ,write your local nexus group url

5

好吧,这困扰了我一段时间,所以我发现一个人在github上为maven编写了一个SBT插件,名为maven-sbt,因此您要做的就是将其包含在您的插件项目中并使用maven使您的项目mixin.MavenDependencies以及您与本地Maven一起进行的所有操作(例如更新和发布本地工作)。这样做的好处是,如果您像我一样,您的组织都是专家。因此,您所有的库都在本地Maven存储库中,但是如果出于某种原因首先使用sbt进行构建,那么您也将开始在ivy中获得一堆或罐子。浪费空间和时间,因为您仍然需要将其用于Maven构建。

就是说,我希望这已内置到sbt中,所以我不需要将其添加到每个项目中。也许至少是一个处理器。他在一件事中提到,我读到他想将其添加到0.9,但我找不到它。


1

我收到此错误的原因是我在中有一个空白文件~/.sbt/repositories。将存储库添加到文件和删除文件都解决了该问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.