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

Chr*_*eng 5 java applet noclassdeffounderror classloader

我得到了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
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

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

我知道applet无法从jar加载类,Applet类加载器在applet的jar中找不到类,但我认为它们不适用于我的情况.SomeClass和MyApplet位于同一个jar中,页面在本地访问.

Buh*_*ndi 1

Caused by: java.io.IOException: open HTTP connection failed:https://myserver/mycontext/applets/another/package/SomeClass.class
Run Code Online (Sandbox Code Playgroud)

从 HTTPS 服务器检索 jar 文件时似乎存在连接问题。

我不知道您运行的是哪个版本的 Java,但您可以在此处检查与您的问题相关的缺陷原因。

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

更新您的班级是否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)
Run Code Online (Sandbox Code Playgroud)

请记住,小程序就像 Flash 对象:

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

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

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

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

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