我的类路径出了什么问题?

时间:2011-06-20 01:49:13

标签: java applet classpath jpct

我正在尝试使用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)

我做错了什么?

2 个答案:

答案 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。