【问题标题】:java classpath in shellshell中的java类路径
【发布时间】:2013-02-05 02:45:31
【问题描述】:

这是一个shell脚本:

#!/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 是否使用不正确?

【问题讨论】:

  • 没有$MY_LIBls 命令的输出,很难说。乍一看,我会说缺少 logback,但如果没有 ls,我无法确定。
  • @fge 有更新,添加 ls
  • 所以,你确实有 logback。这很奇怪。另一方面,为什么同时使用 logback 和 commons-logging?
  • 但是,我认为不会影响运行,在eclipse中可以正常工作

标签: java shell jar classpath


【解决方案1】:

JoranExceptionlogback-core-1.0.6.jar 中,但您不能同时使用 -jar-classpath 选项。

java - the Java application launcher

-jar
...
使用此选项时,JAR 文件是所有用户类的来源,其他用户类路径设置将被忽略。

【讨论】:

    【解决方案2】:

    将以下行添加到您的脚本中,以便您可以调试程序正在查找的类是否在这些 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

    【讨论】:

    • 如何使用命令与 CLASSPATH=/home/user/.../*.jar ??
    • java -cp .:"/home/user/mygitproject/myproject/lib/*.jar" -jar build/libs/myproject.jar
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多