2009-10-12 13 views
19

Jest to typowy problem. Używam 2 bibliotek, które zależą od różnych wersji tego samego słoika.
Powiedzmy, że w czasie wykonywania muszę THIS.xxxjarJava Classloader - jak odwoływać się do różnych wersji słoiczka

MY.jar 
    -> A.jar -> THIS.1.0.0.jar 
    -> B.jar -> C.jar -> THIS.5.0.0.jar 

mogę skompilować specyficzną słoik (A.jar/B.jar) przed jego uzależnienia, ale przy starcie mam załadować tylko 1 wersja. Który?
Zależność tylko od obciążenia 1 (najnowsza wersja) oznacza, że ​​mój kod prawdopodobnie wyrzuci wyjątki w czasie wykonywania, jeśli biblioteki nie są kompatybilne z poprzednimi wersjami (czy są tam biblioteki zgodne z poprzednimi wersjami?).

W każdym razie wiem, że coś takiego jak OSGi może rozwiązać ten problem.
Zastanawiam się co to stary sposób na rozwiązanie tego rodzaju problemów ...

Thanks a lot

+0

Czy można to osiągnąć? Jak OSGi pomaga? Ponownie wprowadzamy zależność od OSGi, która jest napowietrzeniem w typowym rozwoju oprogramowania produktu (zwłaszcza w przypadku osadzania) – sskumar86

Odpowiedz

7

"Stara droga", o której wspomniałeś (i której OSGI z pewnością używa pod maską), to zainstaluj własną klasę ClassLoader dla obu gałęzi twoich zależności. W ten sposób na przykład serwery aplikacji mogą uruchamiać starsze i nowsze wersje tej samej aplikacji w tej samej maszynie JVM.

Przeczytaj o hierarchii modułów ładujących.

W twojej konfiguracji trudną częścią jest punkt wspólny, w którym spotykają się klasy z obu oddziałów. Żadne gałęzie nie mogą używać klas załadowanych do innego. Aby to zadziałało, upewnij się, że tylko klasy załadowane przez bootloader klasy (klasy JRE) lub classloader z pliku MY.jar są przekazywane do obu gałęzi.

1

wiele bibliotek są wstecznie kompatybilne. Ale nie wszystkie ..


Stary sposób polega na próbie uzależnienia od tylko jednej wersji.

Prawdopodobnie bezpieczniej jest skompilować obie wersje z tą samą wersją (najnowszą).
Przynajmniej otrzymujesz błędy podczas kompilacji, zamiast błędów w czasie wykonywania.

W razie potrzeby można zmienić trochę swoją bibliotekę, która działa ze starą zależność ...
będzie to wymagało dostępu do źródła ...


Należy pamiętać, że zgodność w czasie kompilacji nie gwarantuje poprawnego działania środowiska wykonawczego. Jest to jeden krok, potem można:

  • odczytać pliku whatsnew dla nowej wersji słoika
  • spojrzenie na Internet dla zgłaszających problemy z kompatybilnością
  • zapisu JUnits
  • użytkowników porównać kody oba słoiki:
4

OSGi może naprawić ten problem. Pakiet OSGi to nic innego jak słoik z dodatkowymi wersjami szczegółów metadanych. Pakiet ma numer wersji i będzie zawierać szczegółowe numery wersji (lub zakresy) zależnych słoików.

Aby uzyskać więcej informacji, zobacz this introductory Javaworld article.

Aby rozwiązać ten problem bez OSGi, należy ręcznie skompilować i uruchomić z kompatybilnymi jarami. Jak odkryłeś, niekoniecznie jest to banalne zadanie. Ponieważ słoiki niekoniecznie identyfikują ich wersje, jedyny pewny sposób to zrobić, aby nagrać/porównać sumy kontrolne lub podpisy.

1

Jak wspomniano w KLE, domyślnym podejściem jest uzależnienie od nowszej wersji. Nie ma żadnej gwarancji, ale przez większość czasu to działa. Prawdopodobnie najlepszym sposobem (będąc bycie rozdętym) jest używanie OSGI do przebrnięcia przez to.

Powiązane problemy