3

java -classpath以前にワイルドカード拡張機能を使用して成功しました。現在、奇妙な問題が発生しています。

ワイルドカードはjar、名前付きフォルダー内のすべてに展開されるはずです。オラクルからの引用は次のとおりです。

Class path entries can contain the basename wildcard character *, 
which is considered equivalent to specifying a list of all the files 
in the directory with the extension .jar or .JAR. For example, the 
class path entry foo/* specifies all JAR files in the directory 
named foo. A classpath entry consisting simply of * expands to a 
list of all the jar files in the current directory.

これは、クラスパスに関する Java 6 の Oracle ドキュメントへのリンクです。

私が見ている動作はこれと矛盾しています。ここで3回実行します。最初は and に明示的に名前jarを付けているため、機能します。他のものはワイルドカードを使用して失敗します。なんで?私はワイルドカード (他の場所) に依存しているため、これは私にとって重要であり、この予期しない動作を理解することは私にとって重要です。

#!/bin/bash

printf "The EV is...\n"
echo $CLASSPATH
printf "The working directory is...\n"
pwd
printf "Directory listing...\n"
ls 
printf "END of directory listing.\n"

printf "Test with named jar.\n"
java -javaagent:../sizeof/sizeof.jar -classpath ./testsizeof.jar info.zqxj.test.Tester

printf "Test with star.\n"
java -javaagent:../sizeof/sizeof.jar -classpath * info.zqxj.test.Tester

printf "Test with dot slash star.\n"
java -javaagent:../sizeof/sizeof.jar -classpath ./* info.zqxj.test.Tester

出力:

The EV is...

The working directory is...
/home/b/Documents/workspace/testsizeof
Directory listing...
bin  run.sh  src  testsizeof.jar
END of directory listing.
Test with named jar.
40
Test with star.
Exception in thread "main" java.lang.NoClassDefFoundError: run/sh
Caused by: java.lang.ClassNotFoundException: run.sh
    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: run.sh.  Program will exit.
Test with dot slash star.
Exception in thread "main" java.lang.NoClassDefFoundError: //run/sh
Caused by: java.lang.ClassNotFoundException: ..run.sh
    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: ./run.sh.  Program will exit.
4

1 に答える 1

6

解決策、クラスパス引数を二重引用符で囲みます。例: -classpath "*" これは、コマンド ラインだけでなく、bash スクリプト内でも必要です。

その後の補遺:

-classpath "~/folder/*"さらに、失敗して-classpath ~/folder/"*"も良いことに注意してください。ワイルドカードを引用しますが、~. 解釈するにはオペレーティングシステムが必要なようですが、ワイルドカードを Java 形式で展開するために渡す必要があるため、ワイルドカード~を引用する必要があります。*java

また、意図しない結果になるため、java展開を要求しないでください。*.jarJava 仕様によると、正しいワイルドカードは唯一のもの*です。

于 2013-02-06T06:15:33.910 に答える