9

メソッドを実行することになっているシェルスクリプトを実行していmainます:

java -classpath /path/to/app/conf/lib/nameJar* com.example.ClassTest

この時点で、次の例外が発生します。

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)

これは、スプリングジャーが別のフォルダーにあるためです。だから私はスクリプトを変更しました:

java -classpath /path/to/app/conf/lib/nameJar*:/path/to/app/lib/spring* com.example.ClassTest

ただし、このスクリプトでは、com.example.ClassTestが見つかりません。この問題について何かアイデアはありますか?

前もって感謝します

4

2 に答える 2

15

Javaクラスパスのワイルドカード拡張は異常です。

ドキュメントから:

クラスパスワイルドカードを理解する

クラスパスエントリには、ベース名のワイルドカード文字*を含めることができます。これは、拡張子が.jarまたは.JARのディレクトリ内のすべてのファイルのリストを指定するのと同じと見なされます。たとえば、クラスパスエントリfoo / *は、fooという名前のディレクトリ内のすべてのJARファイルを指定します。*だけで構成されるクラスパスエントリは、現在のディレクトリ内のすべてのjarファイルのリストに展開されます。

したがって、指定する必要があるのは次のとおりです。

java -classpath /path/to/app/conf/lib/*:/path/to/app/lib/*

特定のjarのみが必要な場合は、それらを個別に追加する必要があります。クラスパス文字列は、、 などの一般的なワイルドカードを受け入れません。nameJar**.jarspring*

詳細については、「 javaクラスパスでの複数のjarの設定」を参照してください。

于 2012-06-01T09:42:31.107 に答える
0

JVMはSpring関連のJARSを見つけることができないようです。必要なすべてのJARSを1つの場所(たとえばc:\ libs)に配置し、「java」コマンドを実行するときに「java.ext.dirs」を使用します

お気に入り :

java -Djava.ext.dirs=c:/libs com.example.ClassTest
于 2012-06-01T09:40:53.037 に答える