2017-12-27 9 views
0

In meinem Beispiel muss ich eine Abhängigkeit lösen, deren Artefakte nicht den herkömmlichen jar als Verpackungstyp haben, sondern maven-plugin (genauer gesagt, das Artefakt, das mich interessiert, ist ein Maven-Plugin). Dies wird in Mavenland über das XML-Tag <packaging> angegeben.Wie kann ich eine Abhängigkeit in sbt auflösen, die einen anderen Packaging-Efeuyp hat?

Wenn ich das Plugin hinzufüge hängt mein Projekt in der sbt Build, aktualisiert sbt erfolgreich das Projekt, aber die aufgelöste Abhängigkeit ist nicht im Klassenpfad. Wie kann ich sbt das Artefakt zu meinem Klassenpfad hinzufügen, so dass Code, der von dieser Abhängigkeit abhängt, kompiliert?

-Code, die ich verwendet, um die Maven-Plugin, um mein Build hinzuzufügen:

libraryDependencies += "net.alchim31.maven" % "scala-maven-plugin" % "3.3.1" 

Antwort

0

Es gibt zwei Gründe, warum sbt nicht das gewünschte Artefakt zu dem Classpath hinzufügt und damit Kompilierung fehlschlägt. Der erste Grund ist, dass sbt standardmäßig nur Artefakte erkennt, deren Pakettyp begrenzt ist (jar, bundle und ein paar mehr). Um sbt zu sagen, wir sind in einem Artefakt, dessen Verpackungsart interessiert ist maven-plugin, müssen wir die Artefakte, die wir aus der Abhängigkeit möchten ausdrücklich sagen, mit:

libraryDependencies += ("net.alchim31.maven" % "scala-maven-plugin" % "3.3.1") 
    .withExplicitArtifacts(Vector("scala-maven-plugin", "maven-plugin", "jar")) 

Sobald wir dies getan haben, können wir bestätigen, dass sbt hat in der Tat unseren Artefakt erhalten, indem sie den folgenden Code in consoleProject ausgeführt wird:

Keys.update.in(myScope).in(myProject).eval.allFiles 
    .find(_.getAbsolutePath.contains("net")) 

Beachten sie, dass myScope entweder Compile sein muss, Test oder Runtime (in der Regel, es ist Compile) und dass myProject muss ein refere sein nce zu dem Projekt, zu dem Sie die Abhängigkeit deklariert haben. Das Ergebnis der vorherigen Operation lautet Some(...), wenn alles gut abgelaufen ist. Dies bedeutet, dass das Artefakt tatsächlich aufgelöst und erkannt wurde.

Allerdings sind wir nicht fertig. Wenn wir myProject/dependencyClasspath ausführen, diesmal aus der sbt-Shell, werden wir unser Artefakt dort nicht sehen. Hier ist der zweite Schritt erforderlich: Wir müssen unseren neuen Verpackungstyp zu classpathTypes hinzufügen, so dass sbt das Artefakt unserem Kompilierungsklassenpfad hinzufügt.

classpathTypes += "maven-plugin" 

Mit all dies erledigt ist, sollten wir myProject/dependencyClasspath laufen und unser Artefakt vorhanden sehen.

Aber die Geschichte ist nicht vorbei, und hier betreten wir "Bug" Territorium. Sbt fügt die Pakettypen in classpathTypes nicht automatisch zu der Pom-Konfiguration hinzu, die für das Deklarieren der Abhängigkeiten in der Pom-Datei verantwortlich ist. Beachten Sie, dass andernfalls Ihre Anwendung mit ClassNotFoundException oder einem ähnlichen Problem fehlschlägt, weil nicht alle abhängigen Artefakte aufgelöst und geladen wurden.

Also, um eine funktionierende Anwendung zu haben, müssen Sie es selbst tun:

makePomConfiguration := 
    makePomConfiguration.value.withIncludeTypes(classpathTypes.value) 

Die Tatsache, dass dies nicht standardmäßig durchgeführt wird, es ist nur ein sbt Fehler in 1.x

Verwandte Themen