Ich habe einen Multi-Modul SBT Build bestehend aus api
, core
und third-party
. Die Struktur ist ungefähr das:
Der Code für third-party
implementiert api
und wird wörtlich von woanders kopiert, also möchte ich ihn nicht wirklich berühren.
Wegen der Art und Weise, wie third-party
implementiert ist (starker Gebrauch von Singletons), kann ich nicht core
von third-party
abhängig machen. Genauer gesagt muss ich es nur über api
verwenden, aber ich brauche mehrere isolierte Kopien von third-party
zur Laufzeit. (Dadurch kann ich mehrere "Singletons" gleichzeitig haben.)
Wenn ich außerhalb meines SBT-Builds laufe, mache ich das einfach:
%Vor% Aber das Problem ist, dass ich nicht weiß, wie ich zur Laufzeit herausfinden soll, was ich URLClassLoader
als Argument geben soll, wenn ich über sbt core/run
laufe.
Das sollte funktionieren, obwohl ich es nicht mit deinem Setup getestet habe.
Die Grundidee besteht darin, den Klassenpfad in eine Datei schreiben zu lassen, die Sie selbst schreiben kann zur Laufzeit verwenden. sbt-buildinfo bietet schon eine gute Grundlage dafür, also werde ich es hier benutzen, aber du könnte nur den relevanten Teil extrahieren und dieses Plugin nicht verwenden.
Fügen Sie dies Ihrer Projektdefinition hinzu:
%Vor%Verwenden Sie zur Laufzeit Folgendes:
%Vor% exportedProducts
enthält nur die kompilierten Klassen für das Projekt (z. B. .../target/scala-2.10/classes/
). Abhängig von Ihrer Konfiguration möchten Sie möglicherweise stattdessen fullClasspath
verwenden
(die auch die libraryDependencies und abhängigen Projekte enthält) oder einen anderen mit dem Klassenpfad verbundenen Schlüssel.
Tags und Links scala classloader sbt