2010-02-24 8 views
5

Otrzymuję ff. Błąd w Java Console occassionally:Program ładujący klasy Applet nie może znaleźć jednej z klas w słoju.

Exception in thread "thread applet-my.package.MyApplet-10" java.lang.NoClassDefFoundError: another/package/SomeClass 
    at my.package.MyApplet.init(MyApplet.java:95) 
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: another.package.SomeClass 
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
    ... 3 more 
Caused by: java.io.IOException: open HTTP connection failed:https://myserver/mycontext/applets/another/package/SomeClass.class 
    at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source) 
    at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source) 
    at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    ... 7 more 

Mój tag aplet jest następujący:

<applet codebase="../../applets" code="my.package.MyApplet" class="invisible" id="myApplet"> 
    <param value="value0" name="param0"/> 
    ... 
    <param value="valueN" name="paramN" /> 
    <param value="folder/myApplet__0.0.1177.jar,folder/commons-io-1.3.2__0.0.1177.jar,..." name="cache_archive"/> 
    <param value="0.0.1177.0,0.0.1177.0,...," name="cache_version"/> 
</applet> 

Ważne jest, podkreślam słowo "okazyjnie". Czasami aplet jest inicjowany bez problemu. Oznacza to również, że często po ponownym uruchomieniu przeglądarki problem znika.

Jestem świadomy applet fails to load class from jar i Applet class loader cannot find a class in the applet's jar, ale myślę, że nie mają one zastosowania w mojej sprawie. SomeClass i MyApplet są w tym samym słoiku, a strona jest dostępna lokalnie.

+0

myślę, co się dzieje, jest to, że przeglądarka plug-in Java nie był w stanie załadować klasę z myApplet__0.0.1177.jar i tak poszedłem szukać go w folderze codebase. Teraz pytanie brzmi: w jaki sposób można załadować MyApplet, ale nie SomeClass? –

+0

Jaka wersja Java jest używana po stronie klienta? – uthark

+0

Powiedziałeś, że strona jest dostępna lokalnie, ale w logach widzę "myserver". Czy to nazwa twojego komputera localhost? Również, jakiej przeglądarki używasz do testowania? Internet Explorer, firefox? – uthark

Odpowiedz

1
Caused by: java.io.IOException: open HTTP connection failed:https://myserver/mycontext/applets/another/package/SomeClass.class 

Wygląda na to, że wystąpił problem z połączeniem z pobieraniem pliku jar z serwera HTTPS.

Nie wiem dokładnie, która wersja Java jest uruchomiona, ale możesz sprawdzić przyczynę usterki odnoszącą się do twojego problemu here.

Jeśli to nie jest problem, a następnie upewnij się, że jest wystarczająco dużo pamięci podręcznej dla pliku JAR, gdy pobrane indziej to nie zostanie uruchomiony. Niestety, nie jest to kwestia kodu.

AKTUALIZACJA Czy Twoja klasa uzyskuje dostęp do dowolnego zdalnego serwera lub bazy danych przez przypadek?

Wyjątkiem wyraźnie pokazuje, że nie jest AccessControl przywilej, który został odrzucony.

at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source) 
    at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source) 
    at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 

Należy pamiętać, że są jak aplety Flash Przedmioty:

  • Oboje są pobierane i biegnie od strony klienta.

Jedyną różnicą jest to, że aplety zostały zaprojektowane z dużą ilością zasad kontroli dostępu, takie jak, nie musi łączyć się z serwerami kryją firmy DMZ (De-zmilitaryzowanej Zone), itp

Jeśli to przypadek, Proponuję znaleźć sposób na odzyskanie danych poza apletami (spróbuj serwletu?)

UPDATE 2 Wygląda na to, że JVM nie może znaleźć zaufanego certyfikatu zgodnego z podpisanym słojem.

  1. Ponieważ plik jar jest podpisał upewnić się, że plik jar może wskazać swój zaufany certyfikat (pamiętaj, musi być zaufany).
  2. więcej informacji, sprawdź: http://faq.javaranch.com/java/HowCanAnAppletReadFilesOnTheLocalFileSystem I http://www.developer.com/article.php/3303561
+0

Jeśli jest to problem z połączeniem, czy adres URL w komunikacie wyjątku nie powinien być adresem https: // myserver/mycontext/applets/myApplet__0.0.1177.jar? Wygląda na to, że wtyczka szuka pliku klasy w bazie kodu. –

+0

Sprawdź mój zaktualizowany wpis. –

+0

SomeClass nie uzyskuje dostępu do żadnego zdalnego serwera lub bazy danych. Jest to jednak czytanie plików z lokalnego systemu plików. Zawinęłam to w uprzywilejowane wezwanie. Podpisałem też słoiki. Myślę, że wtyczka przeglądarki Java wykonuje uprzywilejowany dostęp. –