4

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


我遇到了一个小程序(实际上是一个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>
4

1 回答 1

8

通过查看针对相关问题发布的建议找到了答案。埃迪的回答并没有解决那个特定的问题,但它确实为我提供了解决方案。

我的问题不是特别明显的是 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>

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

于 2009-05-16T17:54:26.630 回答