0

マップされたネットワーク ドライブ上にある Java クラスを実行できるかどうかを調べています。例は次のとおりです。

C:\temp\groovy>java p:\Test
Exception in thread "main" java.lang.NoClassDefFoundError: p:\Test
Caused by: java.lang.ClassNotFoundException: p:\Test
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: p:\Test.  Program will exit.

これを試す前に、UNC 共有 ( java ) にある Java クラス ファイルを実行できるかどうかを確認したかったのです\\somehost\share\Test。これも機能しませんでした-クラス定義が見つからないという同じエラー。

私は何か間違ったことをしていますか、それとも本当にサポートされていませんか?

ありがとう

4

2 に答える 2

3

クラス名の一部としてパスを指定すると、Java はそれが含まれるフォルダー階層に対応するパッケージ内にあると想定します。

例:

> java z:/Test
java.lang.NoClassDefFoundError: z:/Test
Caused by: java.lang.ClassNotFoundException: z:.Test

ここでは、完全修飾クラス名として「z:.Test」を探しています。

Test クラスがどのパッケージでも宣言されていないと仮定すると、クラスパスでディレクトリを指定する必要があります。

java -cp Z:\path Test
于 2011-06-24T18:53:10.623 に答える
1

Java ランチャは、呼び出されるメイン メソッドを見つけるための最初の非オプション引数としてクラスを受け入れます。

ドキュメントから:

デフォルトでは、最初の非オプション引数は呼び出されるクラスの名前です。完全修飾クラス名を使用する必要があります。-jar オプションが指定されている場合、オプション以外の最初の引数は、アプリケーションのクラス ファイルとリソース ファイルを含む JAR アーカイブの名前であり、起動クラスは Main-Class マニフェスト ヘッダーによって示されます。

Java ランタイムは、ブートストラップ クラス パス、インストールされた拡張機能、およびユーザー クラス パスの 3 つの場所で、スタートアップ クラスおよび使用されるその他のクラスを検索します。

したがって、p:\Test引数として指定することはできません。代わりに、現在の作業ディレクトリを に変更してp:\、 を実行しjava Testます。

これを手動で実行せずに、バッチ スクリプトを使用してディレクトリを変更できます。または、クラスを (必要なマニフェストと共に) JAR ファイルにパッケージ化し、JAR ファイル-jarへの絶対パスをjava実行可能ファイルに指定するオプションを提供できます。これは、あまり多くのクラス ファイルを管理したくない場合に適しています。

編集: -cp@Dave Costa で指定されたフラグを使用することもできます。これにより、現在のディレクトリを変更する必要がなくなります。

于 2011-06-24T18:53:09.080 に答える