Verwenden eines benutzerdefinierten Klassenladeprogramms für eine Modulabhängigkeit in SBT

9

Ich habe einen Multi-Modul SBT Build bestehend aus api , core und third-party . Die Struktur ist ungefähr das:

%Vor%

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.

    
larsrh 11.04.2015, 14:07
quelle

1 Antwort

4

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.

    
knutwalker 11.04.2015, 16:12
quelle

Tags und Links