我有一个我无法理解的奇怪问题...我有一个简单的 HelloWorld jar,它是我在 Eclipse 中构建的,它有 Apache Loggings
jar 在它的类路径上。我写了一个脚本来运行 jar:
#!/bin/sh
export CLASSPATH=lib/*:$CLASSPATH
java -jar HelloWorld.jar
这里的目录结构是一个带有HelloWorld.jar
的主目录和一个 lib
包含 commons-logging-1.1.1.jar
的子目录.
运行此脚本工作正常。但是,当我放置 HelloWorld.jar
进入lib
目录(即在一个地方包含所有 JAR),并执行 java -jar lib/HelloWorld.jar
,我得到:
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
错误。为什么?!?!?!?!
我问这个是因为我在 OSX 上使用 JarBundler 为 HelloWorld 应用程序创建一个应用程序包,并将修改后的脚本放在 MacOS
中目录,而所有库都放在 Resources/Java
中目录。脚本的修改版本是:
#!/bin/sh
RESOURCE_DIR=$(cd "../Resources"; pwd)
export CLASSPATH=$RESOURCE_DIR/Java/*:$CLASSPATH
java -jar $RESOURCE_DIR/Java/HelloWorld.jar
我遇到了与上述相同的错误,如果能帮助我理解为什么我不能这样做和/或如何解决它,我将不胜感激?
最佳答案
类路径不适用于通配符。每个 jar 都必须明确指定,或者作为 CLASSPATH 变量的一部分,或者在包含在类路径中的另一个 jar 的 list 中。
此外,IIRC java -jar 会忽略类路径中存在的所有第三方 jar。为什么不这样做呢?
java -cp yourJar:logJars <mainClass>
关于Java Jar 和 Classpath 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7757916/