我开始问这个问题,然后在提交之前找到了答案。无论如何,我决定发布这个问题,以便其他遇到同样问题的人能够从我的错误中吸取教训。
我在使用小程序时遇到问题(aJApplet实际上)无法实例化与小程序包含在同一 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 中。如果我使用列出内容jar tvf CM_Library.jar
我可以看到它位于正确的包下。然而,上面的连锁异常让我相信类加载器没有在档案中搜索JDataStore
,并且正在 Web 服务器上查找 JDataStore.class 文件。为什么是这样?类加载器知道从 jar 中加载 MediatorApplet 类,为什么它不检查 JDataStore 呢?如果我没有在小程序标签上正确指定参数,我也会将其包含在此处:
<applet id="mediator-applet"
width="0"
height="0"
codebase="./"
archive="CM_Library.jar"
code="com.company.program.cm.hmi.MediatorApplet">
</applet>
通过查看找到了答案一条建议发布了一个相关问题。埃迪的回答并没有解决这个特定问题,但它确实为我提供了解决方案。
从我的问题中不太明显的是 JDataStore 类继承自另一个包含在不同 jar 中的类。我已经有几个月没有处理 JDataStore 的实现细节了,所以我完全忘记了它的父类 org.json.simple.JSONObject 并不在 CM_Library.jar 中,而是在 json_simple-1.0 中.2.jar。修复相当简单,只需将丢失的 jar 复制到代码库目录,然后将丢失的 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>
这修复了错误。异常消息并不是特别有帮助。它会让您相信它根本找不到该类,而实际问题是它无法加载所请求类的超类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)