【问题标题】:What's wrong with my classpath?我的类路径有什么问题?
【发布时间】:2011-06-20 01:49:13
【问题描述】:

我正在尝试使用 jPCT 制作一个小程序。使用 jPCT 需要将 jPCT jar 添加到类路径中。我以为我有它,但我仍然得到一个关于 jPCT 类之一的 class not found 异常。

我的命令:

$ 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)

我做错了什么?

【问题讨论】:

  • 运行 javac 时请显示完整的错误信息
  • @bba 运行 javac 时没有错误信息。唯一的错误消息是在我打开页面时运行 Firefox 的终端中产生的。我已经发布了。
  • 我怀疑你的机器主机名是applet,试试localhost
  • @Jarrod Amahi 给了我一个... 独特的 DHCP设置。我将小程序名称作为“小程序”放入 Amahi 控制面板,因此它说将“小程序”放在地址栏中以访问它。我的服务器与我的开发机器是不同的机器,所以 localhost 不起作用(无论如何我在我的服务器上尝试过,不行),但是我 am 在我的服务器上从 Apache 获得了我的 HTML 文件.
  • @Jarrod 等等,现在它开始工作了!我想我也遇到了缓存问题....非常感谢!

标签: java applet classpath jpct


【解决方案1】:

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

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

Here is the relevant reading materials.

ARCHIVE = 归档列表

这个可选属性描述了一个 或更多包含类的档案 和其他资源 “预装”。类已加载 使用一个实例 给定的 AppletClassLoader 代码库。 archiveList 中的档案 用“,”分隔。注意:在 JDK1.1 中, 多个APPLET标签相同 CODEBASE 共享同一个实例 类加载器。这被一些人使用 实现小程序间的客户端代码 沟通。未来的 JDK 可能会提供 小程序间的其他机制 沟通。 出于安全原因, 小程序的类加载器可以读取 仅来自同一代码库 小程序已启动。这表示 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>

【讨论】:

  • 它们在同一个目录中,我的 &lt;applet&gt; 代码与您的示例相匹配,“查看源代码”验证我的 HTML 服务是否正确,但我仍然遇到相同的错误。我知道它正在寻找罐子,因为当它不是时,在我问这个问题之前,它会发出警告说它找不到它们。这些都消失了,但我的错误仍然存​​在。
  • 原来它只是因为我换了机器才起作用。至少这意味着它是客户端,而不是我的代码的问题。我想我接下来可能会尝试 SU。感谢您的帮助。
【解决方案2】:

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

【讨论】:

  • 一般来说,你不应该把.jar文件放在Tomcat的lib目录下,它们应该放在WEB-INF/lib,也有例外,但它们很少而且相差甚远.
  • 好吧~不得不说你说的很准,那我们应该把jpct.jar文件的路径写到tomcat/conf目录下的server.xml中吧?
  • 作为一般规则,您永远不必退出任何 Tomcat 特定文件或将任何文件放在 Tomcat 特定目录中,一切都应该放在.war
  • 在我准备好之前,我不会使用任何服务器。都是本地的,所以现在我只是在 FireFox 中打开我的 HTML 文件。
  • @John applet 需要知道从哪里加载依赖项,并且出于安全原因,它必须是为 applet 提供服务的 服务器。您可以从任何 Web 服务器提供您的 html 和 .jar 文件,但它们必须来自服务器,applet 安全模型才能找到它们。
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
相关资源
最近更新 更多