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