2010-09-27 14 views
12

Próbuję ćwiczyć się za pomocą niestandardowych ładowarek klas i mam kilka pytań. Czy istnieje sposób, aby wskazać JVM do używania mojego niestandardowego modułu ładującego klasy na całym świecie? Na przykład napisałem małą aplikację działającą pod Tomcat 6. Serwletem zarządza kontener, gdzie powinienem ustawić mój program ładujący klasy? Ponadto, webapp używa słoików innych firm, czy mogę kontrolować ładowanie klas tych słoików?Jak ustawić niestandardowy program ładujący klasy jako domyślny?

Czy odpowiedzi na powyższe będą inne w przypadku samodzielnej aplikacji?

Dzięki!

Odpowiedz

12

Można ustawić domyślny układ ładujący klasy jako argument JVM:

java -Djava.system.class.loader 
    =com.test.YourCustomClassLoader com.test.YourMainClass 

Jak Tomcat rozpoczyna jako aplikacja Java można ustawić ten parametr też na %TOMCAT_HOME%\bin\run.bat lub $TOMCAT_HOME/bin/run.sh wykonywalnego.

Edit wykonania: Jeśli ustawisz classloader jak ładowarki klasy de System, będzie on używany do załadowania klasy Tomcat komponentu różnych bibliotek i własne klasy. Jeśli chcesz, aby program ładujący klasy był używany tylko dla klas aplikacji (w tym bibliotek i tak), należy skonfigurować element Loader dla kontekstu. Element Loader musi być zdefiniowany wewnątrz elementu Context, który można zdefiniować w pliku context.xml. Więcej informacji:

+0

Z jakiegoś powodu otrzymałem ja java.lang.Error: java.lang.IllegalStateException: recursive invocation. Oto, co zrobiłem: podklasy ClassLoader, dostarczając c'tor, które pobierają parametr ClassLoader jako, skonfigurowałem go za pomocą opcji -Djava.system.class.loader i ... Bum! Wystąpił błąd podczas inicjalizacji maszyny wirtualnej :-(Czy coś mi umknęło? – Seffy

+0

Bez widoku na twoim kodzie, nie mogę ci powiedzieć na pewno: –

+0

Przetestowałem go z małą aplikacją główną, którą mam, i jest uruchamiany OK –

Powiązane problemy