Applet类加载器无法在applet的jar中找到类

我开始问这个问题,然后在提交之前找出答案。 我决定发布这个问题,以便遇到同样问题的其他人能够从我的错误中吸取教训。


我遇到了applet(实际上是JApplet )无法实例化另一个类的问题,该类与applet包含在同一个jar中。 我在Java控制台上看到的exception是:

线程“线程applet-com.company.program.cm.hmi.MediatorApplet-1”中的exceptionjava.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)
     at sun.plugin2.applet.Plugin2Manager $ AppletExecutionRunnable.run(Unknown Source)
    在java.lang.Thread.run(未知来源)
引起: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个
引起:java.io.IOException:打开HTTP连接失败: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(未知来源)
    在sun.plugin2.applet.Applet2ClassLoader $ 1.run(未知来源)
     at java.security.AccessController.doPrivileged(Native Method)
     ......还有8个

我知道JDataStore类包含在jar中。 如果我使用jar tvf CM_Library.jar列出内容,我可以看到它在适当的包下面。 但是,上面链接的exception使我相信类加载器不是在搜索JDataStore的存档,而是在Web服务器上查找JDataStore.class文件。 为什么是这样? 类加载器知道从jar加载MediatorApplet类,为什么不检查JDataStore呢? 如果我没有在applet标签上正确指定参数,我也会在这里包含:

   

通过查看针对相关问题发布的建议找到答案。 Eddie的回答并没有解决这个问题,但确实给了我解决方案。

从我的问题中不是特别明显的是,JDataStore类inheritance自另一个包含在不同jar中的类。 我几个月没有处理JDataStore的实现细节,所以我完全忘记它的父类org.json.simple.JSONObject不在CM_Library.jar中,而是在json_simple-1.0中.2.jar。 修复非常简单,只需将缺少的jar复制到codebase目录,并将缺少的jar添加到applet标记的archive属性中以逗号分隔的归档列表中:

   

这解决了错误。 exception消息不是特别有用。 当实际问题是它无法为所请求的类加载超类时,它会让你相信它根本找不到类。