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的时候)?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具