如何让sbt使用本地maven代理存储库(Nexus)?

Har*_*lan 72 scala nexus ivy maven sbt

我有一个sbt(Scala)项目,目前从Web上提取工件.我们希望转向一个可以缓存工件的企业标准化Nexus存储库.从Nexus文档中,我了解如何为Maven项目执行此操作.但是sbt显然使用了不同的方法.(我知道Ivy会以某种方式参与其中,但我从未使用它,也不了解它是如何工作的.)

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

谢谢!

Rob*_*een 33

步骤1:按照详细主题:代理存储库中的说明进行操作,我已将其汇总并添加到下面:

  1. (如果您使用Artifactory,则可以跳过此步骤.)在公司Maven存储库中创建一个完全独立的 Maven代理存储库(或组),以代理常春藤样式的存储库,例如以下两个重要的存储库:

    这是必需的,因为一些存储库管理器无法处理混合在一起的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]
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将该文件保存在.sbt主目录中的目录中,或在sbt命令行中指定它:

    sbt -Dsbt.repository.config=<path-to-your-repo-file>
    
    Run Code Online (Sandbox Code Playgroud)

对于那些使用旧版本的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文件中指定的任何存储库.这可能仅适用于0.12及以上的版本 - 我还没有尝试过.
  2. 在构建文件中使用fullResolvers := Seq( 解析器作为公司maven存储库 ),而不是使用resolvers ++=或者resolvers :=使用过的任何内容.

  • 如果你想为每个项目配置它(如原始问题中所述)并且不想在每个`sbt`运行中添加命令行选项,你可以在你的"build"旁边创建一个名为".sbtopts"的文件. SBT".将选项(`-Dsbt.override.build.repos = true -Dsbt.repository.config = <...>`)放入其中,它们将被`sbt`可执行文件拾取. (2认同)

Har*_*lan 12

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

我的构建类现在看起来像以下(加上其他一些repos):

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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 现在,Play 2 Final和SBT 0.11.2已经过时了. (5认同)

Von*_*onC 9

您所需要的只是定义一个属性文件sbt.boot.properties,它允许您:

  • 重新定义常春藤缓存位置(我需要它,因为它将成为我们漫游Windows配置文件的一部分,这在我们的商店中的磁盘空间受到严重限制.请参阅问题74)
  • 定义你想要的任何其他Maven回购
    C:\HOMEWARE\apps\sbt-0.74\sbt.boot.properties

    [scala]
      version: 2.7.7
    #  classifiers: sources, javadoc

    [app]
      org: org.scala-tools.sbt
      name: sbt
      version: read(sbt.version)
      class: sbt.xMain
      components: xsbti
      cross-versioned: true
      classifiers: sources, javadoc

    [repositories]
      local
      my-nexus: http://my.nexus/nexus/content/repositories/scala-tools/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]
      maven-local
    #  sbt-db: http://databinder.net/repo/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]
    #  maven-central
    #  scala-tools-releases
    #  scala-tools-snapshots

    [boot]
     directory: project/boot
     properties: project/build.properties
     prompt-create: Project does not exist, create new project?
     prompt-fill: true
     quick-option: true

    [log]
     level: debug

    [app-properties]
     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)

    [ivy]
     cache-directory: C:\HOMEWARE\projects\.ivy2\cache

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

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

可以按照以下方式之一以增加的优先顺序配置启动器:

  • 替换中的/sbt/sbt.boot.properties文件jar.
  • sbt.boot.properties在类路径中放置一个命名的配置文件.将它放在没有/sbt前缀的类路径根目录中.
  • 在命令行上指定备用配置的位置.这可以通过以下方式完成:
    • 将该位置指定为系统属性 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 %*
Run Code Online (Sandbox Code Playgroud)

和你的SBT会下载神器从:

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

刚刚在家中使用旧的Nexus opensource 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"  
Run Code Online (Sandbox Code Playgroud)

这给了:

[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
Run Code Online (Sandbox Code Playgroud)

如果我在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
Run Code Online (Sandbox Code Playgroud)

所以它确实限制了我定义的两个回购:

[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]
Run Code Online (Sandbox Code Playgroud)

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

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

C:\Prog\Scala\tests\pp>sbt
Error during sbt execution: No repositories defined.
Run Code Online (Sandbox Code Playgroud)

如果我把2.7.7(虽然仍然有所有 repo评论),是的,它不会产生错误:

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
Run Code Online (Sandbox Code Playgroud)

但那只是因为它在我之前的尝试中已经下载了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.
Run Code Online (Sandbox Code Playgroud)


fox*_*mon 6

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

加两行

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

repo.properties的内容是

[repositories]
    local
    public: http://222.vvfox.com/public  <-fix this ,write your local nexus group url
Run Code Online (Sandbox Code Playgroud)


ozo*_*one 5

好吧,这已经让我感到困扰了一段时间,所以我发现一个人在github上为maven编写了一个名为maven-sbt的SBT插件,所以你所要做的就是将它包含在你的插件项目中并使你的项目与maven.MavenDependencies混合以及所有操作,例如更新和发布 - 本地工作与您当地的maven.关于这一点的好处是,如果你像我一样,你的组织就是全部.所以,你们所有的lib都在你们当地的maven回购中,但是如果你出于某种原因首先用sbt构建,那么你们也开始在常春藤中获得一堆或者罐子.多么浪费空间和时间,因为你仍然需要为你的maven构建获取它们.

也就是说,我希望这可以内置到sbt中,所以我不需要将它添加到每个项目中.也许至少作为处理器.他在一件事情中提到我想将它添加到0.9但我无法找到它.