2009-05-16 2 views
4

Я начал задавать этот вопрос, а затем выяснил ответ перед его отправкой. Я решил оставить вопрос в любом случае, чтобы другие люди, столкнувшиеся с одной и той же проблемой, могли учиться на моих ошибках.Апплет-загрузчик классов не может найти класс в банке апплета


У меня возникли проблемы с апплетом (а) JApplet фактически не в состоянии создать экземпляр другого класса, который включен в том же банке, что и апплет. Исключение я вижу на консоли Java является:

 
Exception in thread "thread applet-com.company.program.cm.hmi.MediatorApplet-1" java.lang.NoClassDefFoundError: com/company/program/cm/cs/JDataStore 
    at com.company.program.cm.hmi.MediatorApplet.getMediator(MediatorApplet.java:63) 
    at com.company.program.cm.hmi.MediatorApplet.init(MediatorApplet.java:49) 
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: com.company.program.cm.cs.JDataStore 
    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) 
    ... 4 more 
Caused by: java.io.IOException: open HTTP connection failed:http://localhost:8080/TransportHMI/pages/com/company/program/cm/cs/JDataStore.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) 
    ... 8 more 

Я знаю, что JDataStore класс включен в банке. Если я перечислил содержимое, используя jar tvf CM_Library.jar, я вижу, что он находится под правильным пакетом. Тем не менее, приведенные выше исключения исключают, что я считаю, что загрузчик классов не ищет архив для JDataStore и ищет файл JDataStore.class на веб-сервере. Почему это? Погрузчик класса знает, как загрузить класс MediatorApplet из банки, почему он не проверяет его для JDataStore? В случае, если я не указал параметры правильно на апплет теге, я включу, что и здесь:

<applet id="mediator-applet" 
     width="0" 
     height="0" 
     codebase="./" 
     archive="CM_Library.jar" 
     code="com.company.program.cm.hmi.MediatorApplet"> 
</applet> 

ответ

8

Найден ответ, глядя на a suggestion публикуемого для related question. Ответ Эдди не разрешил эту конкретную проблему, но это дало мне решение для моего.

Что не особенно очевидно из моего вопроса, так это то, что класс JDataStore наследуется от другого класса, который содержится в другой банке. Мне не приходилось разбираться с деталями реализации JDataStore через пару месяцев, поэтому я полностью забыл, что его родительский класс org.json.simple.JSONObject не был в CM_Library.jar, но был в json_simple-1.0 .2.jar. Исправление довольно просто, просто скопировать недостающую банку в каталог и добавьте кодовую базу недостающую баночки через запятую список архивов в атрибуте Апплета тега archive:

<applet id="mediator-applet" 
     width="0" 
     height="0" 
     codebase="./" 
     archive="CM_Library.jar, json_simple-1.0.2.jar" 
     code="com.company.program.cm.hmi.MediatorApplet"> 
</applet> 

Это исправляет ошибку. Сообщение об исключении не особенно полезно. Это заставило бы вас поверить, что он не может найти класс вообще, когда актуальной проблемой является то, что он не может загрузить суперкласс для запрошенного класса.

+0

спасибо за это - я потратил часы, пытаясь понять это. – Matt

+0

Полезно знать, что этот вопрос был полезен кому-то, кроме меня. –