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.class 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ć.

0
bezmax 16 czerwiec 2011, 11:30

2 odpowiedzi

Najlepsza odpowiedź

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.

1
Suraj Chandran 16 czerwiec 2011, 11:40
Dzięki, myślę, że to w pełni odpowiada na pytanie. Również specjalne podziękowania za wspomnienie o OSGI, teraz wiem, że istnieje i czytanie o nim :D
 – 
bezmax
16 czerwiec 2011, 11:52

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ą).

0
Nikolay Antipov 16 czerwiec 2011, 11:45
Załadowanie go do oddzielnej maszyny wirtualnej JVM byłoby zbyt zasobochłonne. Podejście zaproponowane przez Suraja Chandrana jest znacznie lepsze, ponieważ pozwala załadować wszystko do jednej JVM przy użyciu oddzielnych programów ładujących klasy.
 – 
bezmax
16 czerwiec 2011, 11:54
Hmmm. Być może. Ale możesz sprawdzić, jak działa OSGi. To bardzo ciężkie rozwiązanie. Cóż, twoja decyzja jest twoją decyzją :-). Powodzenia!
 – 
Nikolay Antipov
16 czerwiec 2011, 12:07