scala maven ivy nexus sbt

scala - ¿Cómo obtengo sbt para usar un repositorio de proxy Maven local(Nexus)?



ivy (6)

Tengo un proyecto sbt (Scala) que actualmente extrae artefactos de la web. Nos gustaría avanzar hacia un repositorio Nexus estandarizado corporativo que guarde en caché los artefactos. De la documentación de Nexus, entiendo cómo hacer eso para los proyectos de Maven. Pero obviamente, sbt usa un enfoque diferente. (Entiendo que Ivy está involucrado de alguna manera, pero nunca lo he usado y no entiendo cómo funciona).

¿Cómo le digo a sbt y / o al Ivy subyacente que utilicen el sistema de repositorio corporativo de Nexus para todas las dependencias? Me gustaría la respuesta para usar algún tipo de archivo de configuración a nivel de proyecto, de modo que los nuevos clones de nuestro repositorio de origen usen automáticamente el proxy. (Es decir, andar con los archivos de configuración por usuario en un directorio de puntos no es viable).

¡Gracias!


Bueno, esto me ha molestado por un tiempo, así que encontré un tipo que ha escrito un plugin SBT para maven en github llamado maven-sbt así que todo lo que tienes que hacer es incluirlo en tu proyecto de complementos y hacer tu proyecto mezclando con maven.MavenDependencies y todas sus operaciones, como actualización y publicación local, trabajan con su experto local. Lo bueno de eso es que si eres como yo, tu organización es todo maven. Entonces, todas las librerías están en tu repositorio maven local pero si por alguna razón construyes primero con sbt, entonces comienzas a obtener un grupo o jarras en hiedra también. Qué desperdicio de espacio y tiempo, ya que todavía necesitarás conseguirlos para tus construcciones maven.

Dicho esto, me gustaría que esto estuviera integrado en sbt, así que no tendría que agregarlo a cada proyecto. Tal vez como procesador al menos. Mencionó en una cosa que leí que le gustaría agregarlo a 0.9 pero no he podido encontrarlo.


OK, con algo de ayuda de Mark Harrah en la lista de correo sbt, tengo una respuesta que funciona.

Mi clase de construcción ahora se ve como la siguiente (además de algunos otros repositorios):

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 }

Ahora, si borro el árbol Squeryl del directorio .ivy2/cache de mi máquina, sbt intenta tomarlo del árbol Nexus con la URL apropiada. ¡Problema resuelto!


Obtuve este error porque tenía un archivo en blanco en ~ / .sbt / repositories. Agregar repositorios al archivo y eliminar el archivo resolvió el problema.


Paso 1: siga las instrucciones en Topics: Repositorios Proxy , que he resumido y agregado a continuación:

  1. (Si está utilizando Artifactory, puede omitir este paso). Cree un repositorio proxy (o grupo) de Maven completamente separado en su repositorio corporativo de Maven, para proxy de repositorios de hiedra como estos dos importantes:

    Esto es necesario porque algunos administradores de repositorios no pueden manejar los repositorios estilo Ivy y estilo Maven mezclados.

  2. Cree un repositories archivos, enumerando tanto su repositorio corporativo principal como cualquier otro que haya creado en el paso 1, en el formato que se muestra a continuación:

    [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. Guarde ese archivo en el directorio .sbt dentro de su directorio de inicio o especifíquelo en la línea de comando sbt:

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

Buenas noticias para aquellos que usan versiones anteriores de sbt : aunque en el jar del lanzador sbt 0.12.0 al menos, los archivos de propiedades de arranque para las versiones antiguas de sbt no contienen la línea requerida (la que menciona repository.config ), seguirá funcionando para esas versiones de sbt si edita esos archivos para agregar la línea requerida, y los vuelve a empaquetar en el jar lanzador sbt 0.12.0! Esto se debe a que la característica se implementa en el iniciador, no en el mismo sbt. Y se dice que el iniciador sbt 0.12.0 puede ejecutar todas las versiones de sbt, ¡de regreso a 0.7!

Paso 2: para asegurarse de que los repositorios externos no se estén utilizando, elimine los repositorios predeterminados de sus resolvedores. Esto se puede hacer de una de estas dos formas:

  1. Agregue la opción de línea de comando -Dsbt.override.build.repos=true mencionada en la página de temas detallados más arriba. Esto hará que los repositorios que especificó en el archivo anulen los repositorios especificados en cualquiera de sus archivos sbt. Sin embargo, esto solo podría funcionar en sbt 0.12 y superiores, aún no lo he probado.
  2. Use fullResolvers := Seq( resolver (s) para sus repositorios maven corporativos ) en sus archivos de compilación, en lugar de resolvers ++= o resolvers := o lo que sea que solía usar.

Todo lo que necesita es definir un archivo de propiedad sbt.boot.properties que le permitirá:

  • redefinir la ubicación del caché ivy (lo necesito porque sería parte de nuestro perfil itinerante de Windows , que está severamente limitado en espacio de disco en nuestra tienda. Consulte el problema 74 )
  • defina cualquier otro repositorio de Maven que desee

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

Nota: este archivo sbt.boot.properties está inspirado en:

He comentado cualquier definición de repositorio externo de Maven y he añadido una referencia a mi propio repositorio de Nexus Maven.

El iniciador se puede configurar de una de las siguientes maneras para aumentar el orden de precedencia:

  • Reemplace el archivo /sbt/sbt.boot.properties en el /sbt/sbt.boot.properties .
  • Coloque un archivo de configuración llamado sbt.boot.properties en classpath. Ponlo en la raíz de classpath sin el prefijo /sbt .
  • Especifique la ubicación de una configuración alternativa en la línea de comando. Esto se puede hacer por:
    • especificando la ubicación como la propiedad del sistema sbt.boot.properties
    • o como el primer argumento al iniciador con el prefijo '' @ ''.

La propiedad del sistema tiene una prioridad menor.
La resolución de una ruta relativa es:

  • primer intento contra el directorio de trabajo actual,
  • luego contra el directorio de inicio del usuario,
  • y luego contra el directorio que contiene el jar lanzador.

Se genera un error si ninguno de estos intentos tiene éxito.

Defina un contenedor sbt.bat (para asegurarse de especificar su sbt.boot.properties ) como:

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 %*

Y tu sbt descargará artefactos solo desde:

  • tu Nexus
  • su repositorio local de Maven.

Acabo de probar en casa con un viejo Nexus opensource 1.6 que tenía funcionando, 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"

Eso da:

[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

Si intento un valor extraño en el archivo 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

Por lo tanto, se limita a los dos repo que he definido:

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

(Comenté todo lo demás: local , maven-local , ...)

Si comento todos los repositorios y pongo un valor gracioso (2.7.9) para la versión scala en el sbt.boot.properties , obtengo (como lo hizo el OP)

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

Si pongo 2.7.7 (mientras sigo teniendo todos los repo comentados), sí, no generará un error:

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

Pero eso es solo porque ya había descargado scala2.8.0 durante mis intentos anteriores.
Si elimino esa biblioteca de mi project/boot directorio de project/boot , arrojaré una Excepción:

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


edite el archivo de configuración en sbt_home / conf "sbtconfig.txt"

agregar dos líneas

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

el contenido de repo.properties es

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