如何获得使用本地maven代理库(Nexus)?
我有一个(斯卡拉)项目,目前从网上拉工件。 我们想要转向一个公司标准化的Nexus存储库,以caching工件。 从Nexus文档,我明白如何为Maven项目做到这一点。 但是sbt显然使用了不同的方法。 (我理解常春藤是以某种方式参与的,但是我从来没有用过它,也不明白它是如何工作的。)
如何告诉sbt和/或底层的Ivy使用公司的Nexus存储库系统来处理所有的依赖关系? 我想要使用某种项目级configuration文件的答案,以便我们的源代码库的新克隆将自动使用代理。 (即,在每个用户的configuration文件在一个点目录是不可行的)。
谢谢!
步骤1:按照详细主题:代理存储库中的说明进行操作,我已经总结并添加到以下内容:
-
(如果使用的是Artifactory,则可以跳过这一步。)在您的公司Maven存储库上创build一个完全独立的 Maven代理存储库(或组),以代理常见的ivy样式的存储库,例如以下两个重要的存储库:
- http://repo.typesafe.com/typesafe/ivy-releases/
- http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/
这是需要的,因为一些版本库pipe理器不能处理混合在一起的Ivy风格和Maven风格的版本库。
-
创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]
-
将该文件保存在
.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器中删除默认存储库。 这可以通过以下两种方式之一来完成:
- 在上面的详细主题页面上添加命令行选项
-Dsbt.override.build.repos=true
。 这将导致您在文件中指定的存储库覆盖任何sbt文件中指定的任何存储库。 这可能只适用于0.12及以上,但我还没有尝试过。 - 在您的构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:
- replace
jar
的/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]
(我评论了其他一切: local
, local
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中有一个空白的文件。 将存储库添加到文件并删除文件解决了问题。