web-dev-qa-db-de.com

wie bekomme ich sbt, um ein lokales Maven Proxy-Repository (Nexus) zu verwenden?

Ich habe ein sbt (Scala) -Projekt, das derzeit Artefakte aus dem Web zieht. Wir möchten zu einem unternehmensstandardisierten Nexus-Repository wechseln, in dem Artefakte gespeichert werden. Aus der Nexus-Dokumentation verstehe ich, wie das für Maven-Projekte gemacht wird. Sbt verfolgt jedoch offensichtlich einen anderen Ansatz. (Ich verstehe, dass Ivy irgendwie involviert ist, aber ich habe es nie benutzt und verstehe nicht, wie es funktioniert.)

Wie kann ich sbt und/oder dem zugrunde liegenden Ivy mitteilen, dass das Nexus-Repository-System für alle Abhängigkeiten verwendet werden soll? Ich möchte, dass die Antwort eine Art Konfigurationsdatei auf Projektebene verwendet, sodass neue Klone unseres Quell-Repositorys automatisch den Proxy verwenden. (Das heißt, es ist nicht praktikabel, mit benutzerspezifischen Konfigurationsdateien in einem Punktverzeichnis zu verhandeln.) 

Vielen Dank!

69
Harlan

Schritt 1: Befolgen Sie die Anweisungen unter Detaillierte Themen: Proxy-Repositorys , die ich unten zusammengefasst und hinzugefügt habe:

  1. (Wenn Sie Artifactory verwenden, können Sie diesen Schritt überspringen.) Erstellen Sie ein vollständig getrenntes Maven-Proxy-Repository (oder eine Gruppe) in Ihrem Maven-Repository für Unternehmen, um Ivy-Stil-Repositorys wie z wie diese zwei wichtigen:

    Dies ist erforderlich, da einige Repository-Manager nicht mit Ivy- und Maven-Repositorys arbeiten können, die gemischt werden.

  2. Erstellen Sie eine Datei repositories, in der sowohl Ihr Hauptunternehmens-Repository als auch jedes weitere, das Sie in Schritt 1 erstellt haben, im folgenden Format aufgeführt ist:

    [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. Speichern Sie die Datei entweder im Verzeichnis .sbt in Ihrem Ausgangsverzeichnis oder geben Sie sie in der Befehlszeile von sbt an:

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

Gute Nachrichten für diejenigen, die ältere Versionen von sbt verwenden: Auch wenn die Boot-Eigenschaftendateien für ältere sbt-Versionen zumindest in der sbt 0.12.0-Launcher-jar nicht die erforderliche Zeile enthalten (die, die repository.config erwähnt) , es wird immer noch für diese Versionen von sbt funktionieren, wenn Sie diese Dateien bearbeiten, um die erforderliche Zeile hinzuzufügen, und sie in das sbt 0.12.0-Launcher-Glas packen! Dies liegt daran, dass die Funktion im Launcher implementiert ist, nicht in sbt selbst. Und der sbt 0.12.0-Launcher soll alle Versionen von sbt auf 0.7 zurückbringen können!

Schritt 2: Um sicherzustellen, dass keine externen Repositorys verwendet werden, entfernen Sie die Standard-Repositorys von Ihren Resolvern. Dies kann auf zwei Arten erfolgen:

  1. Fügen Sie die Befehlszeilenoption -Dsbt.override.build.repos=true hinzu, die oben auf der Seite mit den detaillierten Themen erwähnt wurde. Dies hat zur Folge, dass die in der Datei angegebenen Repositorys alle in Ihren sbt-Dateien angegebenen Repositorys überschreiben. Dies kann jedoch nur in sbt 0.12 und darüber funktionieren - ich habe es noch nicht probiert.
  2. Verwenden Sie fullResolvers := Seq(Resolver (s) für Ihre Unternehmens-Maven-Repositorys) in Ihren Build-Dateien anstelle von resolvers ++= oder resolvers := oder was auch immer Sie verwendet haben.
30
Robin Green

OK, mit Hilfe von Mark Harrah auf der sbt-Mailingliste habe ich eine Antwort, die funktioniert.

Meine Build-Klasse sieht jetzt wie folgt aus (plus einige andere 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
}

Wenn ich nun den Squeryl-Baum aus dem .ivy2/cache-Verzeichnis meines Computers lösche, versucht sbt, ihn mit der entsprechenden URL aus dem Nexus-Baum herauszuholen. Problem gelöst!

12
Harlan

Sie müssen lediglich eine Eigenschaftendatei sbt.boot.properties definieren, mit der Sie:

  • definieren Sie den Efeu-Cache-Speicherort neu (ich brauche das, weil es sonst ein Teil unseres roaming Windows-Profils wäre , das in unserem Shop stark vom Speicherplatz begrenzt ist. Siehe Ausgabe 74 )
  • definieren Sie ein beliebiges anderes Maven-Repo
 C:\HOMEWARE\apps\sbt-0.74\sbt.boot.properties 

 [scala] 
 Version: 2.7.7 
 # Klassifizierer: sources, javadoc 

 [app] 
 org: org.scala-tools.sbt 
 name: sbt 
 version: lesen (sbt.version) 
 Klasse: sbt.xMain 
 Komponenten: xsbti 
 Cross-versioniert: true 
 Klassifizierer: Quellen, Javadoc 

 [Repositories] 
 lokal
 my-nexus: http://my.nexus/nexus/content/repositories/scala-tools/, [organisation]/[modul]/[revision]/[type] s/[artefakt] (- [klassifikator]). [ext] 
 maven-local 
 # sbt-db: http://databinder.net/repo/, [organisation]/[modul]/[revision]/[type] s/[artefakt] (- [klassifizierer]). [ext] 
 # maven-central 
 # scala-tools-release 
 # scala-tools-snapshots 

 [Stiefel]
 Verzeichnis: Projekt/Boot 
 Eigenschaften: project/build.properties 
 Prompt-create: Projekt existiert nicht, neues Projekt anlegen? 
 Prompt-fill: true 
 Schnelloption: wahr 

 [Log]
 level: debug 

 [App-Eigenschaften] 
 project.name: quick = set (test), new = Eingabeaufforderung (Name) [p], fill = Eingabeaufforderung (Name) 
 Projektorganisation: new = Prompt (Organisation) [org.vonc] 
 project.version: quick = set (1.0), new = Eingabeaufforderung (Version) [1.0], füllen = Eingabeaufforderung (Version) [1.0] 
 build.scala.versions: quick = set (2.8.0.RC2), new = Eingabeaufforderung (Scala-Version) [2.8.0.RC2], füllen = Eingabeaufforderung (Scala-Version) [2.8.0.RC2] 
 sbt.version: quick = set (0.7.4), new = Eingabeaufforderung (sbt-Version) [0.7.4], fill = Eingabeaufforderung (sbt-Version) [0.7.4] 
 project.scratch: quick = set (true) 
 project.initialize: quick = set (true), new = set (true) 

 [Efeu]
 Cache-Verzeichnis: C:\HOMEWARE\projects\.ivy2\cache 

Hinweis: Diese sbt.boot.properties-Datei wurde inspiriert von:

Ich habe jede external Maven-Repository-Definition kommentiert und einen Verweis auf mein eigenes Repository für Nexus Maven hinzugefügt.

Der Starter kann auf eine der folgenden Arten in aufsteigender Reihenfolge konfiguriert werden:

  • Ersetzen Sie die /sbt/sbt.boot.properties-Datei in der jar.
  • Fügen Sie eine Konfigurationsdatei mit dem Namen sbt.boot.properties in den Klassenpfad ein. Fügen Sie es ohne den Präfix /sbt in das Klassenpfad-Stammverzeichnis ein.
  • Geben Sie den Ort einer alternativen Konfiguration in der Befehlszeile an. Dies kann durch Folgendes geschehen:
    • entweder Angabe des Speicherorts als Systemeigenschaft sbt.boot.properties 
    • oder als erstes Argument für den Launcher mit dem Präfix '@'. 

Die Systemeigenschaft hat eine niedrigere Priorität.
Auflösung eines relativen Pfads ist:

  • zuerst gegen das aktuelle Arbeitsverzeichnis versucht, 
  • dann gegen das Heimatverzeichnis des Benutzers, 
  • und dann gegen das Verzeichnis mit dem Launcher-Jar. 

Wenn keiner dieser Versuche erfolgreich ist, wird ein Fehler generiert.


Definieren Sie einen sbt.bat-Wrapper (um sicher zu sein, dass Ihrsbt.boot.properties) wie folgt angegeben wird:

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

Und Ihr sbt lädt Artefakte nur von:

  • dein Nexus
  • ihr lokales Maven Repo.

Ich habe es gerade mit einer alten Nexus Opensource 1.6 getestet, die ich ausgeführt habe, 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"  

Das gibt:

[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

Wenn ich einen lustigen Wert in der Datei sbt.boot.properties versuche:

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

Es beschränkt sich also auf die beiden Repos, die ich definiert habe:

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

(Ich habe alles andere kommentiert: local, maven-local, ...)

Wenn ich alle Repositorys kommentiere und einen lustigen Wert (2.7.9) für die Scala-Version in den sbt.boot.properties stelle, bekomme ich (wie das OP)

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

Wenn ich 2.7.7 stelle (während noch all repo kommentiert wurde), dann wird ja kein Fehler generiert:

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

Aber das liegt nur daran, dass scala2.8.0 bereits in meinen vorherigen Versuchen heruntergeladen wurde.
Wenn ich diese Bibliothek aus meinem project/boot-Verzeichnis entferne, wird eine Exception ausgelöst:

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

bearbeiten Sie die Konfigurationsdatei in sbt_home/conf "sbtconfig.txt".

fügen Sie zwei Zeilen hinzu 

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

der Inhalt von repo.properties ist

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

Nun, das hat mich für eine Weile gestört, also habe ich einen Kerl gefunden, der ein SBT-Plugin für maven out auf github namens maven-sbt geschrieben hat. Alles, was Sie tun müssen, ist, es in Ihr Plugins-Projekt aufzunehmen und Ihr Projekt-Mix zu erstellen mit maven.MavenDependencies und all Ihren Vorgängen wie der lokalen Aktualisierung und der lokalen Veröffentlichung von Veröffentlichungen. Das Schöne daran ist, wenn Sie wie ich sind, ist Ihre Organisation alles andere als gut. Also, alle Ihre Bibliotheken befinden sich in Ihrem lokalen Republikaner, aber wenn Sie aus irgendeinem Grund zuerst mit Sbt bauen, dann erhalten Sie auch ein Bündel oder Gläser in Efeu. Was für eine Verschwendung von Raum und Zeit, da Sie immer noch brauchen werden, um sie für Ihren Maven zu bauen.

Ich wünschte, das wäre in sbt eingebaut, so dass ich es nicht jedem Projekt hinzufügen müsste. Vielleicht zumindest als Prozessor. Er hat in einem Buch erwähnt, dass er es gerne zu 0,9 hinzufügen würde, aber ich konnte es nicht finden.

5
ozone

Ich habe diese Fehlermeldung erhalten, weil ich in ~/.sbt/repositories eine leere Datei hatte. Durch das Hinzufügen von Repositorys zur Datei und das Entfernen der Datei wurde das Problem behoben.

0
mehtunguh