Applet与NoClassDefFoundError那不为人知的故事[转]
我要在Applet中嵌入VLC播放器,但是貌似Applet不支持在浏览器浏览的时候播放视频?
下面是找到的一个帖子:
下午用Eclipse写了一个Applet,在Eclipse里面Alt+Shift+X, A之后,灰常完美……
package xii_GUI;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
public class TestApplet extends Applet {
private static final long serialVersionUID = 1L;
String text;
@Override
public void init() {
text = "Hello World";
this.setBackground(new Color(120, 180, 140));
}
@Override
public void paint(Graphics g) {
g.drawString(text, 25, 25);
}
}
然后出去建了一个a.html:
<html>
<applet code="TestApplet.class" width=200 height=150>
</applet>
</html>
然后系统果断造反,给我来了一个华丽的X号……
打开Java的控制台,错误信息:
java.lang.NoClassDefFoundError: TestApplet (wrong name: xii_GUI/TestApplet)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at sun.applet.AppletClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadCode(Unknown Source)
at sun.applet.AppletPanel.createApplet(Unknown Source)
at sun.plugin.AppletViewer.createApplet(Unknown Source)
at sun.applet.AppletPanel.runLoader(Unknown Source)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
网上查了N多资料,有说系统变量问题的,有说jre版本问题的,有说jdk兼容问题的,有说IE内核问题的,
鉴定结果,NND全不管用,囧吧……崩溃,RP溢出了,赶紧扶老奶奶过马路去……
幸亏哥对春哥的信仰虔诚,春哥赐福于我,让我找到一个神贴:
http://topic.csdn.net/u/20080913/13/2d33fec4-c4a3-4349-b3d7-06fadce7d024.html
内容如下:
忽略了package的后果
源文件helloapplet.java因为在package applet中,所以在源文件第一行会有这样一行东西:
package applet;
......
在eclipse里运行小应用程序没有问题,但是用ie浏览器运行html文件,或者用appletviewer命令运行html文件,都会抛出class not found的异常。
helloapplet.html代码如下:
<html>
<head>
<title>Hello Applet! </title>
</head>
<body>
<applet code="helloapplet.class" width=300 height=100>
</applet>
</body>
</html>
在网上查了下,修改如下:
<applet code="helloapplet.class" codebase="D:/eclipseworkspace/helloworld/bin/applet" width=300 height=100>
</applet>
codebase指出class文件所在的基地目录,但是还是报相同的错误,折腾了很久,后来光华版友指出,错误和源文件第一行package语句有关。
于是想到引用包内定义类的格式应该是applet.helloapplet,那么对应的二进制文件引用方法也应该改为applet.helloapplet.class。于是做出
如下修改:
<applet code="applet.helloapplet.class" codebase="D:/eclipseworkspace/helloworld/bin" width=300 height=100>
</applet>
如此就ok了~:)
网上的那些入门applet教程都没有涉及到这些细节,所以想写一下,让后来的人少走些弯路。
其实他说的方法虽然我没弄成功,但是我的问题解决了,就是把那些文件放到default package里面,
这样程序中就不会有package语句,然后把a.html放到TestApplet.class同一个目录里来,完美解决。
花了我俩小时~ 赔了
-------------------------------------
我应用上面的方法,把文件放到default package里面去,然后把.clsass,.java,.html文件件都放在一起(.java可以不这么放),因为要引用到另外的jar包,我的html文件时这么写的
<applet …… archive="包名"> //把包放到和.class一个目录下,要不就是这么写,已jna.jar为例,它的位置是d:\jna.jar,那么 archive="file:///d:\jna.jar"
</applet>
这样虽然没有报错,但是浏览器中并没有播放视频??不知道是不是Applet不支持的原因(用浏览器加载applet的时候)?