在vaadin项目中集成applet时的ClassFormatException

时间:2012-10-20 13:22:03

标签: java applet vaadin

好吧,我正在使用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文件运行相同的applet,它可以正常工作,没有异常。小程序也已签名。

所以, 这个错误意味着什么以及如何解决它。

3 个答案:

答案 0 :(得分: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进行调试。

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

答案 1 :(得分:1)

花了一些时间尝试使用简单的applet来显示浏览器正在使用的java版本。只是一个基本的Vaadin servlet w /只是主页面上的AppletIntegration实例,没有其他真正的东西在进行。

首先,它是类未找到的问题,并且在修复之后我被遗忘了可怕的“类文件中不兼容的魔法值1008813135 ...”消息,我似乎无法绕过它。最后我想出来,以为我会在这里发帖,以防有人来看......

所以这个100881315的魔法值实际上是

在AppletIntegration页面上,甚至在论坛中,有什么不清楚的地方就是应该将jar放在war文件中......

现在任何做过一些applet编码的人都知道CODEBASE是你应该指出罐子在哪里的地方。但是在一个普通的Vaadin servlet中,你还必须知道servlet的url模式在web.xml块中是什么。

通常,您将在web.xml文件中为基于Vaadin的servlet定义一个servlet映射:

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

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

我甚至尝试过创建applets文件夹并将我的CODEBASE设置为“applets /”,但同样的错误也是如此,因为url模式通过Vaadin控制器路由请求。

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

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

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

答案 2 :(得分:0)

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