嗯,我正在使用vaadin AppletIntegration插件来集成我的录音器小程序和我的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,它没有例外地工作得很好。该小程序也已签名。
那么,这个错误意味着什么,以及如何解决它。
发布于 2012-10-22 01:20:21
我花了一些时间尝试使用一个简单的applet来显示浏览器正在使用的java版本。只是一个基本的Vaadin servlet,在主页上只有AppletIntegration实例,没有其他真正的东西。
首先是类没有发现问题,在修复之后,我得到了可怕的“类文件中不兼容的魔术值1008813135……”消息,我似乎就是绕不开。最后我弄明白了,我想我应该在这里发布,以防有人来找我…
所以这个100881315的魔术值实际上是
在AppletIntegration页面上,甚至在论坛上,不清楚的是jar到底应该放在war文件中的什么位置……
现在,任何进行过applet编码的人都知道,CODEBASE是您应该指示jars所在位置的地方。但在普通的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错误...
我甚至尝试过创建一个applets文件夹,并将我的CODEBASE设置为"applets/",但还是出现了同样的错误,因为url模式将请求路由到Vaadin控制器,这会导致阻塞。
所以关键是如何通过Vaadin控制器将jar作为资源返回……如果您还没有猜到,可以通过将您的jar放到VAADIN文件夹中来完成(我通过阅读论坛帖子获得了关于这方面的提示)。
所以我创建了一个VAADIN/applets文件夹,把我的jar放在那里,并将我的代码库设置为"VAADIN/applets/“,瞧,一切都正常……
求求你,Sami,我恳求你把这个小事实添加到Applet集成页面的某个地方,至少这样别人就不用像我那样花几个小时来追踪这个了……
发布于 2012-10-20 21:59:28
你的魔法价值是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进行调试。
这可能是因为他们的免费服务不允许使用applet。
发布于 2012-10-20 22:03:27
实际上,您的神奇代码看起来更像是HTML文件的开头。<!DOCTYPE...。也许你应该检查一下下载是否出错( Firebug、Wireshark或类似的东西)。这可能是404-错误消息。
https://stackoverflow.com/questions/12988854
复制相似问题