Я начал задавать этот вопрос, а затем выяснил ответ, прежде чем отправить его. В любом случае я решил опубликовать вопрос, чтобы другие люди, столкнувшиеся с той же проблемой, могли учиться на моих ошибках.
У меня проблема с апплетом (на самом деле JApplet ), который не может создать экземпляр другого класса, который включен в тот же jar, что и апплет. Исключение, которое я вижу на консоли 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 из jar-файла, почему он не проверяет его и на JDataStore? В случае, если я не указал параметры правильно в теге апплета, я включу это и здесь:
<applet id="mediator-applet"
width="0"
height="0"
codebase="./"
archive="CM_Library.jar"
code="com.company.program.cm.hmi.MediatorApplet">
</applet>