代码之家  ›  专栏  ›  技术社区  ›  A. Levy

applet类加载器在applet的jar中找不到类

  •  4
  • A. Levy  · 技术社区  · 16 年前

    我开始问这个问题,然后在提交之前找出答案。不管怎样,我决定把这个问题贴出来,这样其他遇到同样问题的人就能从我的错误中吸取教训。


    我的小程序有问题(A 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中加载mediateapplet类,为什么不检查jdatastore呢?如果我没有在applet标签上正确地指定参数,我也将在这里包括:

    <applet id="mediator-applet"
            width="0"
            height="0"
            codebase="./"
            archive="CM_Library.jar"
            code="com.company.program.cm.hmi.MediatorApplet">
    </applet>
    
    1 回复  |  直到 11 年前
        1
  •  8
  •   Community CDub    7 年前

    通过观察找到答案 a suggestion 张贴 related question . 埃迪的回答没有解决那个特定的问题,但它确实给了我解决问题的方法。

    我的问题不太明显的是,JDataStore类继承自另一个包含在不同jar中的类。几个月内,我不必处理jdatastore的实现细节,所以我完全忘记了它的父类org.json.simple.jsonObject不在cm_library.jar中,而是在json_simple-1.0.2.jar中。修复相当简单,只需将丢失的jar复制到codebase目录,并将丢失的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>
    

    修复了错误。异常消息没有特别的帮助。它会让您相信它根本找不到类,而实际问题是它无法为请求的类加载超级类。