Gdzie JRE szuka klas

0

Byłem przekonany, że jeśli utworzę plik blabla.jar zawierający wszystkie niezbędne klasy, to JRE po poleceniu java -jar blabla.jar pobierze klasy z tego pliku. Dzisiaj spotkała mnie niespodzianka, JRE (wersja 1.6.10) skorzystała nie z nowej wersji klasy znajdującej się w pliku blabla.jar, ale ze starej siedzącej w pliku przestarzały.jar znajdującym się w katalogu jre.../lib/ext. Zatem pytanie jak w temacie.

0

Z tego co wiem, szuka w lokacjach zdefiniowanych przez zmienną systemową CLASSPATH.

Pytanie, co się stanie, gdy masz takie same klasy w kilku miejscach(blabla.jar i przestarzaly.jar) ? Decyduje kolejność wpisywania folderów w CLASSPATH'ie ? Preferowane są jakieś szczególne miejsca, typu foldery lib w katalogu z JRE ?

Nie ukrywam, że nie wiem, pewnie będziesz musiał sporo na googlach pogrzebać.

0

Wartość zmiennej CLASSPATH chyba nie wszystko wyjaśnia. Kompilator korzystał z nowej wersji klasy - wersje klasy różniły się ilością i typem argumentów konstruktora. Kompilacja szła, a wykonanie nie - "nowy" konstruktor był nieznany.
pozdrawiam

0

JRE ma 3 classloadery:

  1. root - wczytuje klasy systemowe, z jre.jar
  2. extension classloader - z lib/ext
  3. application class loader - CLASSPATH

Jesli wczytywana jest klasa w programie, to uzywany domyslnie jest #3, jednakze w Javie 2 jest tak, ze classloader najpierw oddelegowuje probe wczytania klasy do rodzica. W tym przypadku mozna zauwazyc tego typowy efekt - stara wersja klasy, znajdujaca sie wyzej w hierarchii, przyslania ta pozniej w hierarchi. Musisz usunac stary jr i bedzie dzialac.

1 użytkowników online, w tym zalogowanych: 0, gości: 1