Staram się stworzyć prostą aplikację, która ładuje i uruchamia niektóre klasy w czasie wykonywania. Załóżmy na przykład, że mam taką konfigurację:
module1.classpath=module1.jar,somelibs1.jar
module1.class=com.blabla.Module1
module2.classpath=module2.jar,somelibs2.jar
module2.class=com.blabla.Module2
Następnie muszę załadować biblioteki określone w module1.classpath
i uruchomić module1.class
z załadowanymi bibliotekami. Następnie muszę załadować module2.classpath
i uruchomić module2.clas
s z tymi bibliotekami.
Jak poradzić sobie z przypadkiem, gdy somelibs1.jar
i somelibs2.jar
mają w środku te same klasy? Zasadniczo chciałbym uruchomić module1.jar
używając wyłącznie somelibs1.jar
i module2.jar
używając wyłącznie somelibs2.jar
. Jak to zaimplementować?
Domyślam się, że muszę stworzyć osobny ładowacz klas dla każdej z moich klas i wepchnąć słoiki w tych ładowaczach klas. Jednak byłbym wdzięczny za jakiś przykład lub przynajmniej potwierdzenie, że jest to właściwy sposób, aby to zrobić.
2 odpowiedzi
Wydaje się, że jest to całkiem dobry przypadek użycia dla OSGI. Polecam używać do tego OSGI, ponieważ wszystko, czego potrzebujesz, jest dostarczane przez OSGI out-of-box.
Ale jeśli z jakiegoś powodu nie możesz używać OSGI, to co musisz zrobić, to mieć ładowacz klas dla każdego modułu. Załaduj moduleX.class przez ClassLoaderX, a moduleX.classpath należy dodać do ścieżki ClassLoaderX. Możesz użyć do tego zestawu prostych URLClassLoader.
Dzięki za pytanie. Bardzo interesujące.
Wydaje się, że nie można używać kilku wersji tej samej klasy w jednej instancji JVM. Nigdy nie miałem tego zadania i nie wiem, jak to zrealizować.
Ale zagrajmy. Nie wiem, co to jest egzotyczna aplikacja, którą tworzysz. Być może możesz uruchomić wiele JVM, a każda JVM będzie miała wyłączną CLASSPATH.
Napisz aplikację, która może uruchomić (na przykład używając Runtime.exec()
) inną JVM i nawiązać z nią konwersację przez jakiś kanał (może być siecią).
Podobne pytania
Powiązane pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].