0

我正在尝试用 jPCT 制作一个小程序。使用 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)

我究竟做错了什么?

4

2 回答 2

1

您必须将依赖项放在为 Applet.jar文件提供服务的同一 Web 服务器上,并提供绝对或相对于 Applet 根上下文的位置。

而且您必须从 Web 服务器而不是文件系统将 Applet 加载到 Web 浏览器中。

这是相关的阅读材料。

存档 = 存档列表

此 OPTIONAL 属性描述了一个或多个包含将被“预加载”的类和其他资源的档案。这些类是使用具有给定 CODEBASE 的 AppletClassLoader 的实例来加载的。archiveList 中的档案用“,”分隔。注意:在 JDK1.1 中,具有相同 CODEBASE 的多个 APPLET 标签共享同一个 ClassLoader 实例。一些客户端代码使用它来实现小程序间通信。未来的 JDK 可能会为 Applet 间的通信提供其他机制。出于安全原因,applet 的类加载器只能从与启动 applet 的代码库相同的代码库中读取。这意味着archiveList 中的档案必须与代码库位于同一目录或代码库的子目录中。../a/b.jar 形式的 archiveList 中的条目将不起作用,除非在安全策略文件中明确允许(除非在 http 代码库的情况下,archiveList 中的档案必须来自与代码库相同的主机,但路径中可以有“..”。

如果您的小程序在,/var/www/html/Applet.jar那么最简单的方法是将您的依赖项放在完全相同的位置/var/www/html/jcpt.jar,然后您可以直接引用它,而不必担心计算相对路径。

例子

    <applet code="HelloWorld"
          width=640
          height=480
          archive="HelloWorld.jar,jpct.jar">
    </applet>
于 2011-06-20T21:33:18.750 回答
-2

你用过Tomcat之类的服务器吗?如果有,您可能需要为其分配 jar 文件的路径或将 jpct.jar 复制到 tomcat/lib/ 目录。

于 2011-06-20T02:24:58.900 回答