Что не так с моим classpath? - PullRequest
0 голосов
/ 20 июня 2011

Я пытаюсь сделать апплет с jPCT.Использование jPCT требует добавления jar 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 ]

1 голос
/ 21 июня 2011

Вы должны поместить свои зависимости на тот же веб-сервер, который обслуживает файл апплета .jar, и указать расположение абсолютно или относительно корневого контекста апплета.

И вы должны загрузить свой апплет в веб-браузер с веб-сервера, а не из файловой системы.

Вот соответствующие материалы для чтения.

ARCHIVE = archiveList

Этот необязательный атрибут описывает один или более архивов, содержащих классы и другие ресурсы, которые будут «Предустановленными». Классы загружены используя экземпляр AppletClassLoader с учетом CODEBASE. Архивы в архивеList разделены ",". NB: в JDK1.1, несколько тегов APPLET с одинаковыми CODEBASE совместно используют один и тот же экземпляр ClassLoader. Это используется некоторыми код клиента для реализации меж-апплет коммуникации. Будущие JDK могут обеспечить другие механизмы для взаимодействия между приложениями коммуникации. В целях безопасности загрузчик классов апплета может читать только из той же кодовой базы, из которой апплет был запущен. Это означает что архивы в archiveList должны быть в том же каталоге, что и в Подкаталог, кодовая база. Записи в архивеСписок вида ../a/b.jar не будет работать, если явно разрешено в политике безопасности файл (за исключением случая http кодовая база, где архивы в archiveList должен быть с одного хоста как кодовая база, но может иметь ".." на их пути. )

если ваш апплет на /var/www/html/Applet.jar, то самое простое, что нужно сделать, это поместить ваши зависимости в точно такое же место /var/www/html/jcpt.jar, и тогда вы можете просто ссылаться на него, не беспокоясь о расчете относительного пути.

* * Пример тысячи двадцать-шести * 1 028 *

    <applet code="HelloWorld"
          width=640
          height=480
          archive="HelloWorld.jar,jpct.jar">
    </applet>
0 голосов
/ 20 июня 2011

Вы использовали какой-нибудь сервер, такой как Tomcat?Если у вас есть, вам может потребоваться назначить ему путь к вашему файлу jar или скопировать jpct.jar в tomcat / lib / dir.

...