0

ここにシェルスクリプトがあります:

#!/bin/sh

cd ../../../lib
ls
MY_LIB=`pwd`

for jar in `ls $MY_LIB/*.jar`
do
    CLASSPATH="$CLASSPATH:""$jar" 
done
echo $CLASSPATH

cd ..

#java -jar build/libs/myproject.jar -classpath \"$CLASSPATH\"

このスクリプトを実行すると、次のように出力されます。

commons-codec-1.6.jar      httpclient-4.2.1.jar        httpcore-4.2.1.jar  logback-classic-1.0.6.jar  slf4j-api-1.6.0.jar
commons-logging-1.1.1.jar  httpclient-cache-4.2.1.jar  httpmime-4.2.1.jar  logback-core-1.0.6.jar
:/home/user/mygitproject/myproject/lib/commons-codec-1.6.jar:/home/user/mygitproject/myproject/lib/commons-logging-1.1.1.jar:/home/user/mygitproject/myproject/lib/httpclient-4.2.1.jar:/home/user/mygitproject/myproject/lib/httpclient-cache-4.2.1.jar:/home/user/mygitproject/myproject/lib/httpcore-4.2.1.jar:/home/user/mygitproject/myproject/lib/httpmime-4.2.1.jar:/home/user/mygitproject/myproject/lib/logback-classic-1.0.6.jar:/home/user/mygitproject/myproject/lib/logback-core-1.0.6.jar:/home/user/mygitproject/myproject/lib/slf4j-api-1.6.0.jar
Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/core/joran/spi/JoranException
    at com.test.MainTest.main(MainTest.java:223)
Caused by: java.lang.ClassNotFoundException: ch.qos.logback.core.joran.spi.JoranException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    ... 1 more

なぜ例外が発生するのですか?

クラスパスが間違っていますか?

java -classpath の使用は間違っていますか?

4

2 に答える 2

1

logback-core-1.0.6.jar にJoranExceptionありますが、とオプションの両方を使用することはできません。-jar-classpath

java - Java アプリケーション ランチャーを参照してください。

-jar
...
このオプションを使用すると、JAR ファイルがすべてのユーザー クラスのソースになり、他のユーザー クラス パス設定は無視されます。

于 2013-02-05T09:50:36.163 に答える
0

次の行をスクリプトに追加して、プログラムが探しているクラスがこれらの jar のいずれかの中にあるかどうかをデバッグできるようにします。

for jar in $(cut --output-delimiter=" " -d":" -f2- <<< $CLASSPATH); do
    unzip -l $jar | grep "ch/qos/logback/core/joran/spi/JoranException"
    if [ $? -eq 0 ]; then
        echo "'JoranException' found in $jar" 
    fi
done

# Paste the above code before the following line 
#java -jar build/libs/myproject.jar -classpath \"$CLASSPATH\"

メッセージが表示されない場合は'JoranException' found、jar がありません。同じメッセージが何度も表示される場合は、どこかでクラスが繰り返されています。一度しか印刷されない場合は、この回答にコメントしてさらにデバッグしてください。

ちなみに、Linux では次のように設定できますCLASSPATH

CLASSPATH=/home/user/mygitproject/myproject/lib/*.jar

そして、そのディレクトリに含まれるすべてのjarに展開されます

于 2013-02-05T04:27:04.800 に答える