Ich habe eine Multi-Modul SBT Build bestehend aus api
, core
und third-party
. Die Struktur ist in etwa so:Mit einem benutzerdefinierten Klassenlader für eine Modulabhängigkeit in SBT
api
|- core
|- third-party
Der Code für third-party
implementiert api
und ist wörtlich von woanders kopiert, so ich will es nicht wirklich berühren.
Wegen der Art und Weise third-party
implementiert ist (starker Einsatz von Singletons), kann ich nicht einfach core
von third-party
abhängen. Insbesondere muss ich es nur über die api
verwenden, aber ich muss mehrere, isolierte Kopien von third-party
zur Laufzeit haben. (. Dies ermöglicht es mir zugleich mehrere „Singletons“ zu haben)
Wenn ich außerhalb meines SBT Build ausgeführt wird, ich dies nur tun:
def createInstance(): foo.bar.API = {
val loader = new java.net.URLClassLoader("path/to/third-party.jar", parent)
loader.loadClass("foo.bar.Impl").asSubclass(classOf[foo.bar.API]).newInstance()
}
Aber das Problem ist, dass ich don Ich weiß nicht, wie ich zur Laufzeit herausfinden soll, was ich als Argument zu URLClassLoader
geben sollte, wenn ich über sbt core/run
laufe.
1. Wie beabsichtigen Sie, das Projekt zu bündeln? SBT-Montage? Oder wird das Third-Party.jar extern sein? 2. Welche Form haben die Drittanbieter-Singletons? Objekt? Ich frage, weil Sie erwähnen .newInstance() –
@DaleWijnand 1. Noch nicht entschieden, aber es ist wahrscheinlich, dass ich 'sbt-Assembly' Bundle 'API', 'Kern' und die Scala-Bibliothek und' Drittanbieter .jar' getrennt. – larsrh
@DaleWijnand 2. Es ist ziemlich kompliziert. Grundsätzlich verwaltet die Third-Party-Bibliothek einige externe Prozesse. Es kann viele dieser Prozesse gleichzeitig verarbeiten, muss jedoch initialisiert werden. Bei der Initialisierung füllt er eine Karte innerhalb eines Objekts (d. H. Ein literales Scala-Objekt), z. der Weg zum externen Prozess. Mein Code muss in der Lage sein, mit mehreren Speicherorten dieses externen Prozesses umzugehen. – larsrh