好吧,我正在使用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,它可以正常工作,没有异常。小程序也已签名。
所以, 这个错误意味着什么以及如何解决它。
答案 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错误消息。