Applet类加载器找不到jar中的一个类

时间:2010-02-24 08:51:30

标签: java applet classloader noclassdeffounderror

我得到了ff。偶尔出现在Java控制台中的错误:

Exception in thread "thread applet-my.package.MyApplet-10" java.lang.NoClassDefFoundError: another/package/SomeClass
    at my.package.MyApplet.init(MyApplet.java:95)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: another.package.SomeClass
    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)
    ... 3 more
Caused by: java.io.IOException: open HTTP connection failed:https://myserver/mycontext/applets/another/package/SomeClass.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)
    ... 7 more

我的applet标签如下:

<applet codebase="../../applets" code="my.package.MyApplet" class="invisible" id="myApplet">
  <param value="value0" name="param0"/>
  ...
  <param value="valueN" name="paramN" />
  <param value="folder/myApplet__0.0.1177.jar,folder/commons-io-1.3.2__0.0.1177.jar,..." name="cache_archive"/>
  <param value="0.0.1177.0,0.0.1177.0,...," name="cache_version"/>
</applet>

重要的是我强调“偶尔”这个词。有时applet会毫不费力地初始化。这也意味着,当浏览器重新启动时,问题就会消失。

我知道applet fails to load class from jarApplet class loader cannot find a class in the applet's jar,但我认为它们不适用于我的情况。 SomeClass和MyApplet在同一个jar中,页面在本地访问。

2 个答案:

答案 0 :(得分:1)

Caused by: java.io.IOException: open HTTP connection failed:https://myserver/mycontext/applets/another/package/SomeClass.class

这看起来与从HTTPS服务器检索jar文件存在连接问题。

我不确切知道您运行的是哪个版本的Java,但是您可以检查与您的问题有关的缺陷的原因here

如果这不是问题,那么请确保在下载时JAR文件有足够的缓存,否则无法启动。不幸的是,这不是代码问题。

UPDATE 您的班级SomeClass是否有机会访问任何远程服务器或数据库?

该例外清楚地表明存在被拒绝的AccessControl特权。

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)

请记住,applet就像Flash Objects:

  • 它们都是从客户端下载并运行的。

唯一不同的是,Applet设计了许多访问控制规则,例如,它不能连接到隐藏在公司DMZ(非军事区)后面的服务器等。

如果是这种情况,我建议您找到一种在applet之外检索数据的方法(尝试servlet?)

更新2 似乎JVM找不到与您签名的jar匹配的可信证书。

  1. 由于您的jar文件是已签名,请确保jar文件可以指向您的可信证书(请记住,它必须是可信任的)。
  2. 更多信息,请检查:http://faq.javaranch.com/java/HowCanAnAppletReadFilesOnTheLocalFileSystemhttp://www.developer.com/article.php/3303561

答案 1 :(得分:0)

可能与http://download.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html有关。即,一个或多个罐子定义/期望提供者。调查什么时候有空。