我开始问这个问题,然后在提交之前想出了答案。无论如何,我决定发布这个问题,以便遇到同样问题的其他人能够从我的错误中吸取教训。
我遇到了一个小程序(实际上是一个JApplet)无法实例化与小程序相同的 jar 中包含的另一个类的问题。我在 Java 控制台上看到的异常是:
线程“线程 applet-com.company.program.cm.hmi.MediatorApplet-1”中的异常 java.lang.NoClassDefFoundError: com/company/program/cm/cs/JDataStore 在 com.company.program.cm.hmi.MediatorApplet.getMediator(MediatorApplet.java:63) 在 com.company.program.cm.hmi.MediatorApplet.init(MediatorApplet.java:49) 在 sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(未知来源) 在 java.lang.Thread.run(未知来源) 引起:java.lang.ClassNotFoundException:com.company.program.cm.cs.JDataStore 在 sun.plugin2.applet.Applet2ClassLoader.findClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 java.lang.ClassLoader.loadClassInternal(未知来源) ... 4 更多 引起:java.io.IOException:打开HTTP连接失败:http://localhost:8080/TransportHMI/pages/com/company/program/cm/cs/JDataStore.class 在 sun.plugin2.applet.Applet2ClassLoader.getBytes(未知来源) 在 sun.plugin2.applet.Applet2ClassLoader.access$000(未知来源) 在 sun.plugin2.applet.Applet2ClassLoader$1.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) ... 8 更多
我知道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>