我正在尝试使用jPCT创建一个applet。使用jPCT需要将jPCT jar添加到类路径中。我以为我有它,但是我仍然得到一个关于jPCT类之一的类没有发现异常。
我的命令:
$ javac -classpath /var/www/html/jpct.jar:. /var/www/html/HelloWorld.java
$ jar cf /var/www/html/HelloWorld.jar /var/www/html/HelloWorld.class
我的HTML:
<html>
<head>
<title>Hello World</title>
</head>
<body>
<applet code="HelloWorld"
width=640
height=480
archive="http://applet/HelloWorld.jar,http://applet/jpct.jar">
</applet>
</body>
</html>
我正在使用Apache,并且我已经验证我的jar可以从我的代码中的URL下载。
确切的错误讯息:
$ firefox http://applet/HelloWorld.html
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1~11.04.1)
OpenJDK Server VM (build 20.0-b11, mixed mode)
(firefox-bin:15296): LIBDBUSMENU-GTK-CRITICAL **: dbusmenu_menuitem_property_set_shortcut: assertion `gtk_accelerator_valid(key, modifier)' failed
Unable to use Firefox's proxy settings. Using "DIRECT" as proxy type.
java.lang.NoClassDefFoundError: com/threed/jpct/World
at HelloWorld.init(HelloWorld.java:18)
at sun.applet.AppletPanel.run(AppletPanel.java:436)
at net.sourceforge.jnlp.NetxPanel.run(NetxPanel.java:69)
at java.lang.Thread.run(Thread.java:679)
Caused by: java.lang.ClassNotFoundException: com.threed.jpct.World
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at net.sourceforge.jnlp.runtime.JNLPClassLoader$CodeBaseClassLoader.findClass(JNLPClassLoader.java:1348)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
... 4 more
Exception in thread "TimerQueue" java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:155)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1262)
at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:459)
at java.util.concurrent.DelayQueue.take(DelayQueue.java:205)
at javax.swing.TimerQueue.run(TimerQueue.java:167)
at java.lang.Thread.run(Thread.java:679)
我做错了什么?
答案 0 :(得分:1)
您必须将依赖项放在为Applet .jar
文件提供服务的同一Web服务器上,并且绝对或相对于Applet的根上下文提供位置。
您必须从Web服务器而不是从文件系统将Applet加载到Web浏览器中。
Here is the relevant reading materials.
ARCHIVE = archiveList
此OPTIONAL属性描述了一个 或更多包含类的档案 和其他资源 “预加载”。这些类已加载 使用一个实例 给定的AppletClassLoader CODEBASE。 archiveList中的存档 用“,”分隔。注意:在JDK1.1中, 具有相同的多个APPLET标签 CODEBASE共享一个相同的实例 类加载器。一些人使用这个 用于实现applet间的客户端代码 通讯。未来的JDK可能会提供 小程序间的其他机制 通讯。 出于安全考虑, applet的类加载器可以读取 仅来自相同的代码库 小程序已启动。这意味着 archiveList中的档案必须是 在与...相同的目录中 代码库的子目录。项 在表单的archiveList中./a/b.jar 除非明确说明否则不起作用 允许在安全策略中使用 文件(http除外) 代码库,其中存档 archiveList必须来自同一主机 作为代码库,但可以有“..”的 在他们的路上。)
如果您的applet位于/var/www/html/Applet.jar
,那么最简单的事情就是将您的依赖项放在完全相同的位置/var/www/html/jcpt.jar
,然后您可以参考它而不必担心计算相对路径
示例强>
<applet code="HelloWorld"
width=640
height=480
archive="HelloWorld.jar,jpct.jar">
</applet>
答案 1 :(得分:-2)
您是否使用过像Tomcat这样的服务器?如果有,您可能需要将jar文件的路径分配给它或将jpct.jar复制到tomcat / lib / dir。