如何获得使用本地maven代理库(Nexus)?

我有一个(斯卡拉)项目,目前从网上拉工件。 我们想要转向一个公司标准化的Nexus存储库,以caching工件。 从Nexus文档,我明白如何为Maven项目做到这一点。 但是sbt显然使用了不同的方法。 (我理解常春藤是以某种方式参与的,但是我从来没有用过它,也不明白它是如何工作的。)

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

谢谢!

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

  1. (如果使用的是Artifactory,则可以跳过这一步。)在您的公司Maven存储库上创build一个完全独立的 Maven代理存储库(或组),以代理常见的ivy样式的存储库,例如以下两个重要的存储库:

    这是需要的,因为一些版本库pipe理器不能处理混合在一起的Ivy风格和Maven风格的版本库。

  2. 创build一个文件repositories ,列出您的主公司存储库以及您在步骤1中创build的任何额外存储库,格式如下:

     [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命令行中指定它:

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

对于那些使用旧版本sbt的用户来说,这是个好消息 :尽pipe至less在sdk 0.12.0 launcher jar中,旧sbt版本的启动属性文件并不包含必需的行(提到repository.config )如果你编辑这些文件来添加所需的行,并将它们重新打包到sbt 0.12.0启动器jar中,仍然可以用于这些版本的sbt。 这是因为这个特性是在启动器中实现的,而不是在sbt本身。 而sbt 0.12.0发射器据称能够发射所有版本的sbt,回到0.7!

步骤2:要确保外部存储库没有被使用,请从您的parsing器中删除默认存储库。 这可以通过以下两种方式之一来完成:

  1. 在上面的详细主题页面上添加命令行选项-Dsbt.override.build.repos=true 。 这将导致您在文件中指定的存储库覆盖任何sbt文件中指定的任何存储库。 这可能只适用于0.12及以上,但我还没有尝试过。
  2. 在您的构build文件中使用fullResolvers := Seq( parsing器(s)为您的公司maven版本库 ) ,而不是resolvers ++=resolvers :=或任何您曾经使用过的。

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

我的build设类现在看起来像下面(加上一些其他回购):

 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树中获取它。 问题解决了!

所有你需要的是定义一个属性文件sbt.boot.properties ,这将允许你:

  • 重新定义常青藤高速caching的位置(我需要,因为它会成为我们的漫游Windowsconfiguration文件的一部分 ,这是在我们的商店磁盘空间严重受限,见问题74 )
  • 定义你想要的任何其他Maven回购
     C:\ HOMEWARE \ APPS \ SBT-0.74 \ sbt.boot.properties

     [阶]
      版本:2.7.7
     #分类器:来源,javadoc

     [应用]
       org:org.scala-tools.sbt
      名字:sbt
      版本:读(sbt.version)
       class:sbt.xMain
      组件:xsbti
      交叉版本:正确
      分类器:来源,javadoc

     [库]
      本地
       my-nexus:http://my.nexus/nexus/content/repositories/scala-tools/,[organization] / [module] / [revision] / [type] s / [artifact]( -  [classifier])。 [EXT]
       Maven的地方
     #sbt-db:http://databinder.net/repo/,[organization] / [module] / [revision] / [type] s / [artifact]( -  [classifier])。[ext]
     #maven-central
     #scala-tools-releases
     #scala-tools-snapshots

     [BOOT]
     目录:project / boot
     属性:project / build.properties
     提示 - 创build:项目不存在,创build新项目?
      prompt-fill:true
     快速选项:正确

     [日志]
     级别:debugging

     [应用程序的属性]
      project.name:quick = set(test),new = prompt(Name)[p],fill = prompt(Name)
      project.organization:new = prompt(Organization)[org.vonc]
      project.version:quick = set(1.0),new = prompt(Version)[1.0],fill = prompt(Version)[1.0]
      build.scala.versions:quick = set(2.8.0.RC2),new = prompt(Scala version)[2.8.0.RC2],fill = prompt(Scala version)[2.8.0.RC2]
      sbt.version:quick = set(0.7.4),new = prompt(sbt version)[0.7.4],fill = prompt(sbt version)[0.7.4]
      project.scratch:quick = set(true)
      project.initialize:quick = set(true),new = set(true)

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

注意:这个sbt.boot.properties文件的灵感来源于:

  • 在sbt项目的“Generalized Launcher”页面中提到的那个 。
  • sbt-0.74本身内find的sbt-0.74

我评论过任何外部的 Maven仓库定义,并添加了对我自己的Nexus Maven仓库的参考。

启动器可以按照以下方式之一以增加优先级的顺序进行configuration:

  • replacejar/sbt/sbt.boot.properties文件。
  • 将一个名为sbt.boot.properties的configuration文件放在类path中。 把它放在没有/sbt前缀的classpath中。
  • 在命令行上指定备用configuration的位置。 这可以通过以下方式完成:
    • 指定位置作为系统属性sbt.boot.properties
    • 或者作为以“ @ ”开头的启动程序的第一个参数。

系统属性的优先级较低。
相对path的parsing是:

  • 首先试图反对当前的工作目录,
  • 然后针对用户的主目录,
  • 然后对包含启动器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 /CC:\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回购。

刚刚在家testing了一个旧的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] 

(我评论了其他一切: locallocal maven-local ,…)

如果我评论所有的存储库,并为sbt.boot.properties的scala版本提供一个有趣的值(2.7.9),我确实得到了(像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目录中删除该库,那么它会抛出一个exception:

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

那么这已经给我一段时间了,所以我find了一个在github上编写了一个名为maven-sbt的 github的SBT插件的人,所以你所要做的就是把它包含在你的插件项目中,并使你的项目与maven混合.MavenDependencies和所有的操作,如更新和发布本地与您的本地工作。 关于这件事的好处是,如果你像我一样,你的组织就是所有的maven。 所以,你所有的库都在你当地的maven回购,但如果由于某种原因,你先用sbtbuild立,那么你也开始在常春藤里得到一堆或jar子。 多么浪费空间和时间,因为你仍然需要为你的maven版本获得它们。

这就是说,我希望这是内置的,所以我不需要将其添加到每个项目。 至less也许是一个处理器。 他在一篇文章中提到他想把它加到0.9,但是我一直没能find它。

编辑sbt_home / conf中的configuration文件“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 

我得到这个错误是因为我在〜/ .sbt / repositories中有一个空白的文件。 将存储库添加到文件并删除文件解决了问题。