Mam na dysku trzy wersje klasy o takiej samej (pełnej) nazwie w trzech różnych plikach jar:
a) jar umieszczony obok apletu, wymieniony w parametrze archive,
b) jar w katalogu jre/lib/ext,
c) jar w katalogu jdk/jre/lib/ext.
Nie mogę znaleźć informacji, która wersja klasy zostanie użyta. Z obserwacji wnioskuję, że przy uruchamianiu apletu w przeglądarce wersja b), a przy uruchamianiu za pomocą appletviewera wersja c). Czy mógłby to ktoś potwierdzić?
Nie moge potwierdzic bo nie sprawdzalem, ale moge powiedziec ze Twoje obserwacje maja calkiem logiczne wytlumaczenia. A wiec - klasy z jarow w exts sa ladowane systemowym classloaderem, twoja aplikacja app classloaderem, ktorego ojcem jest systemowy. Jako ze wszystkie CL pakowane w javie se uzywaja delegacji do rodzica zanim same zaczna ladowac klase, wynika z tego ze klasa w ext maja pierwszenstwo i beda zawsze uzywane. Ma to rowniez sens jesli chodzi o bezpieczenstwo - instalujesz dany jar w systemie, ufasz mu, jest podpisany itp itd, i nagle uruchamiasz aplikacje ktora zamienia ta klase na jakies cos bardzo zlego - nie powinno sie to zdarzyc. To troche taka sama zasada jak np. fakt ze w koneterach servletow nie mozna z aplikacja pakowac np servlets-api.jar i podmieniac tam klas, bo to moze sprawic ze caly serwer jest zagrozony.
Dalej, w przegladarce masz zainstalownay plugin ktory uzywa JRE, nie JDK. Appletviewer to jednak aplikacja wchodzaca w sklad JDK, ktore ma swoje prywatne JRE, dlatego te katalogi sa inne.
Ja też sądzę, że to jest logiczne zachowanie, tym niemniej straciłem wczoraj parę godzin. Rozbudowałem pewna klasę narzędziową używana w aplecie, aplet testowałem w appletviewerze, a zupełnie nie pamiętałem, że w jdk/jre/lib/ext jest jar ze starą wersją tej klasy. Rozbudowa klasy polegała na nadpisaniu pewnej metody. Użycie starej wersji klasy nie generowało zatem błędu.