【问题标题】:ClassNotFound exception when loading applet in Chrome在 Chrome 中加载小程序时出现 ClassNotFound 异常
【发布时间】:2011-11-18 06:06:17
【问题描述】:

我很难让 Java 小程序在 Chrome 中运行。类加载器无法找到该类,即使它在 Firefox、Opera 和 Safari 中运行良好。

这是我的测试小程序类(为了简单起见,我什至去掉了包声明):

import java.awt.Graphics;
import java.applet.Applet;

public class Test extends Applet
{
    public void init() { repaint(); }

    public void paint( Graphics g ) {
        g.drawOval(10, 10, 30, 50);
        g.drawLine(15, 30, 22, 32);
        g.fillOval(28, 28, 7, 5);
        g.drawArc(15, 20, 20, 35, 210, 120);
    }
}

这是简约的测试页面:

<!doctype html>
<html><head>
  <meta charset="utf-8"/>
  <title>Test</title>
</head><body>
  <p>
    <object type="application/x-java-applet" width="50" height="70">
      <param name="code" value="Test" />
      Test failed.
    </object>
  </p>
</body></html>

这是堆栈跟踪:

java.lang.ClassNotFoundException: Test
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Applet2ClassLoader.java:252)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Plugin2ClassLoader.java:250)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:180)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:161)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Plugin2ClassLoader.java:687)
    at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:3046)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1498)
    at java.lang.Thread.run(Thread.java:680)

我已经用javac Test.java 编译了这个类,并将.class 文件与.html 文件放在同一个文件夹中。同样,这在 Firefox、Safari 和 Opera 中都运行良好,那么为什么不能在 Chrome 中呢?

我尝试创建一个 jar 并添加 &lt;param name="archive" value="Test.jar" /&gt;,但这没有帮助。

哦,当我问一些东西时:是否有官方规范列出了&lt;param&gt; 参数,可以在&lt;object&gt; 标签中与小程序一起使用?它不在 HTML5 规范中,这是有道理的,但 Oracle 似乎更喜欢旧的废弃 &lt;applet&gt; 标签,我需要使用严格的 HTML5。

环境

运行 OS X 10.7.1 的 MacBook Pro

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode)

谷歌浏览器 13.0.782.220

【问题讨论】:

  • 使用deployJava.js 部署小程序,而不是您自己的自制解决方案。
  • 我同意。我这样做的原因是我正在修改一本关于 HTML 的书。最后,有一个如何插入 Java 小程序的示例,我想保持简短。 Java 部分超出了本书的范围,但在页面中添加小程序则不然。
  • 然后使用applet 元素,而不是object 元素。亲!
  • [请参阅下面我对您的回答的评论]

标签: java html google-chrome applet classnotfound


【解决方案1】:

为了简化测试,请更改以下内容:

<!doctype html>
<html><head>
  <meta charset="utf-8"/>
  <title>Test</title>
</head><body>
  <p>
    <object type="application/x-java-applet" width="50" height="70">
      <param name="code" value="Test" />
      Test failed.
    </object>
  </p>
</body></html>

到这里:

<html>
<head>
  <meta charset="utf-8"/>
  <title>Test</title>
</head>
<body>
  <p>
    <applet code="Test" width="50" height="70">
      Test failed.
    </applet>
  </p>
</body>
</html>

更新 1

请注意,deployJava.js 是当今嵌入小程序的正确方法。它会根据浏览器的需要编写一个对象或嵌入元素,并且旨在正确地执行此操作。

【讨论】:

  • 谢谢。再次,我将我的书更新为 HTML5。在 HTML5 中,&lt;object&gt; 中的 &lt;applet&gt;tag 和属性 classid 都消失了。 &lt;applet&gt; 甚至在 1999 年的 HTML 4.01 中被弃用。我当然会提到这些替代方案作为旧浏览器的后备方案,但我想展示添加小程序的正确新方法。我可以理解为什么 WHATWG 已经从 HTML5 中删除了 Java 特定的内容,而 Oracle 很自然地希望保留 Java 在 HTML 中拥有自己的标签的美好时光。不幸的是,这意味着我无法找到任何有关如何在 HTML5 中添加小程序的官方资源。
  • 这让我回到了.. deployJava.js 有什么问题?这是当今嵌入小程序的正确方法。它会根据浏览器的需要编写一个objectembed 元素,并且它旨在正确地执行此操作。我觉得我们在绕圈子。
  • 我对@9​​87654331@ 的问题是它对这本书来说太过分了。但你是对的;它部署Java小程序的正确解决方案。请在答案中再次写下,以便我将其标记为解决方案!
【解决方案2】:

看起来它只是看不到您的小程序。

  1. archive 参数是必需的 jar 的路径必须是 正确指定。
  2. 如果您不指定路径,则假定它与您的测试页位于同一目录中,而不是子目录。

我们还假设,该 jar 包含您的 Test.class :)

【讨论】:

  • 感谢您的回复!不过,我已经仔细检查过了。很高兴知道存档参数是强制性的——我在哪里可以找到有关参数的文档?
  • “存档参数是强制性的” 不,不是。不是 W3C 的 these examples。此外,如果该元素是一个小应用程序元素,则在小应用程序使用档案时才需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2012-09-24
相关资源
最近更新 更多