我开始问这个问题,然后在提交之前找出答案.我决定发布这个问题,以便遇到同样问题的其他人能够从我的错误中吸取教训.
我遇到了一个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
我知道JDataStore类包含在jar中.如果我使用jar tvf CM_Library.jar列出内容,我可以看到它在适当的包下面.但是,上面链接的异常使我相信类加载器不是在搜索JDataStore的存档,而是在Web服务器上查找JDataStore.class文件.为什么是这样?类加载器知道从jar加载MediatorApplet类,为什么不检查JDataStore呢?如果我没有在applet标签上正确指定参数,我也会在这里包含:
width="0"
height="0"
codebase="./"
archive="CM_Library.jar"
code="com.company.program.cm.hmi.MediatorApplet">