我开始提出这个问题,然后在提交之前找出答案。我决定发布这个问题,以便遇到同样问题的其他人能够从我的错误中吸取教训。
我遇到applet(实际上JApplet)无法实例化另一个类的问题,该类与applet包含在同一个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
我知道jar中包含JDataStore
类。如果我使用jar tvf CM_Library.jar
列出内容,我可以看到它在适当的包下。但是,上面链接的异常使我相信类加载器不在JDataStore
搜索存档,而是在Web服务器上查找JDataStore.class文件。为什么是这样?类加载器知道从jar加载MediatorApplet类,为什么不检查JDataStore呢?如果我没有在applet标签上正确指定参数,我也会在此处包含:
<applet id="mediator-applet"
width="0"
height="0"
codebase="./"
archive="CM_Library.jar"
code="com.company.program.cm.hmi.MediatorApplet">
</applet>
答案 0 :(得分:8)
通过查看a suggestion发布的related question找到答案。 Eddie的回答并没有解决这个问题,但确实给了我解决方案。
从我的问题中不是特别明显的是,JDataStore类继承自另一个包含在另一个jar中的类。我没有必要在几个月内处理JDataStore的实现细节,所以我完全忘记它的父类org.json.simple.JSONObject不在CM_Library.jar中,而是在json_simple-1.0中.2.jar。修复非常简单,只需将缺少的jar复制到codebase目录,并将缺少的jar添加到applet标记的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>
修正了错误。异常消息不是特别有用。当实际问题是它无法为所请求的类加载超类时,它会让你相信它根本找不到类。