0

jPCTでアプレットを作ろうとしています。jPCT を使用するには、jPCT jar をクラスパスに追加する必要があります。私はそれを持っていると思っていましたが、jPCT のクラスの 1 つについてまだクラスが見つからないという例外が発生しています。

私のコマンド:

$ 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

アプレット ファイルを提供している同じ Web サーバーに依存関係を配置し、アプレット.jarのルート コンテキストに対して絶対的または相対的な場所を指定する必要があります。

また、ファイル システムからではなく、Web サーバーからアプレットを Web ブラウザにロードする必要があります。

関連する読み物はこちら。

ARCHIVE = アーカイブ リスト

このオプションの属性は、「プリロード」されるクラスやその他のリソースを含む 1 つ以上のアーカイブを記述します。クラスは、指定された CODEBASE を持つ AppletClassLoader のインスタンスを使用してロードされます。archiveList 内のアーカイブは「,」で区切られています。注意: JDK1.1 では、同じ CODEBASE を持つ複数の APPLET タグが ClassLoader の同じインスタンスを共有します。これは、アプレット間通信を実装するために一部のクライアント コードで使用されます。将来の JDK では、アプレット間通信のための他のメカニズムが提供される可能性があります。セキュリティ上の理由から、アプレットのクラス ローダーは、アプレットが開始されたのと同じコードベースからのみ読み取ることができます。これは、archiveList 内のアーカイブがコードベースと同じディレクトリまたはサブディレクトリにある必要があることを意味します。../a/b.jar の形式の archiveList のエントリは、セキュリティ ポリシー ファイルで明示的に許可されていない限り機能しません (ただし、http コードベースの場合を除きます。ただし、パスに「..」を含めることはできます。 )

アプレットが/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/ dir にコピーする必要があります。

于 2011-06-20T02:24:58.900 に答える