1

好吧,我正在使用 vaadin AppletIntegration Addon 将我的录音机小程序与我的 vaadin 项目集成。这是代码:

  AppletIntegration applet = new AppletIntegration() {

    private static final long serialVersionUID = 1L;

    @Override
    public void attach() {
      System.out.println("In attach functions");

      setAppletArchives(Arrays.asList(new String[] { "SoundRecordingJar.jar" }));
      setCodebase(path);
      setAppletClass("AudioApplet.class");

      setWidth("800px");
      setHeight("500px");
    }
  };
  mainWindow.addComponent(applet);

当我在浏览器中运行它时:它给了我以下异常:

 java.lang.ClassFormatError: Incompatible magic value 1008813135 in class file AudioApplet
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

如果我使用 html 文件运行相同的小程序,它可以正常工作,无一例外。小程序也已签名。

那么,这个错误是什么意思以及如何解决它。

4

3 回答 3

1

你的魔法值是 1008813135

int magic = 1008813135   ;
ByteBuffer b = ByteBuffer.allocate(4);
b.putInt(magic);
System.out.println(new String(b.array()));  

输出:<!DO

类文件似乎已损坏。“神奇值”是文件中的前 4 个字节,它们应始终为 0xCA 0xFE 0xBA 0xBE。相反,它们是 0x3C 0x21 0x44 0x4F(1008813135 转换为十六进制)。它们对应于 ASCII 序列

尝试清除您的 java 缓存或尝试使用其他 PC 进行调试。

可能是他们的免费服务不允许小程序。

于 2012-10-20T13:59:27.940 回答
1

花了一些时间试图通过一个简单的小程序来显示浏览器正在使用的 java 版本。只是一个基本的 Vaadin servlet,只有主页上的 AppletIntegration 实例,没有其他实际的东西。

首先是类未找到问题,修复后我留下了可怕的“类文件中不兼容的魔法值 1008813135 ...”消息,我似乎无法解决。最后我想通了,我想我会在这里发帖,以防有人来看......

所以这个 100881315 的魔法值其实是

AppletIntegration 页面上,甚至在论坛中都不清楚的是,jar 应该放在你的 war 文件中的确切位置......

现在,任何做过applet 编码的人都知道CODEBASE 是您应该指出jar 所在位置的地方。但是在普通的 Vaadin servlet 中,您还必须了解 web.xml 块中 servlet 的 url 模式是什么。

因此,通常您将在 web.xml 文件中为基于 Vaadin 的 servlet 定义如下的 servlet 映射:

  <servlet-mapping>
    <servlet-name>AppletTest</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

所以基本上你通过 Vaadin 控制器路由任何传入的请求,即“/myclasses.jar”,Vaadin 会阻塞它而不返回你的 jar 文件。那是我第一次尝试导致 100881315 错误...

我什至尝试创建一个小程序文件夹并将我的 CODEBASE 设置为“applet/”,但同样的错误是因为 url 模式通过阻塞的 Vaadin 控制器路由请求。

所以关键是如何通过 Vaadin 控制器将 jar 作为资源返回......如果你还没有猜到,它是通过将你的 jar 放入 VAADIN 文件夹来完成的(我通过阅读论坛线程得到了一个提示) .

所以我创建了一个 VAADIN/applet 文件夹,将我的 jar 放在那里,并将我的 CODEBASE 设置为“VAADIN/applet/”,瞧,一切正常......

拜托,萨米,我请求你把这个小真相添加到 Applet 集成页面的某个地方,至少这样其他人可能不必像我那样花时间跟踪这个......

于 2012-10-21T17:20:21.193 回答
0

实际上,您的魔术代码看起来更像是 HTML 文件的开头。<!DOCTYPE.... 也许您应该检查下载是否出错(使用 Firebug、Wireshark 或类似的东西。)这可能是 404 错误消息。

于 2012-10-20T14:03:27.440 回答