Java Jar和Classpath问题

时间:2011-10-13 17:21:19

标签: java macos scripting jar

我有一个奇怪的问题,我无法理解......我有一个简单的HelloWorld jar,我在Eclipse中构建,它的类路径上有Apache Loggings jar。我写了一个脚本来运行jar:

#!/bin/sh
export CLASSPATH=lib/*:$CLASSPATH
java -jar HelloWorld.jar 

此处的目录结构是一个主目录,其中HelloWorld.jarlib子目录包含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应用程序创建了一个Application包,并在MacOS目录中放置了一个修改后的脚本,而所有的lib都放在了{{1 }} 目录。修改后的脚本版本是:

Resources/Java

我得到了与上面相同的错误我真的很感激任何帮助理解为什么我不能这样做和/或如何解决它?

6 个答案:

答案 0 :(得分:6)

Classpath不适用于通配符。必须明确指定每个jar,作为CLASSPATH变量的一部分或在类路径中包含的另一个jar的清单中。

此外,IIRC java -jar会忽略类路径中存在的所有第三方jar。为什么不这样做?

java -cp yourJar:logJars <mainClass>

答案 1 :(得分:2)

尝试直接将commons-logging-1.1.1.jar添加到CLASSPATH

答案 2 :(得分:2)

Java不适用于lib / *,但shell可能正在为您扩展它。仔细检查一下。在导出后放置这样的一行:

echo $CLASSPATH

另外,我建议将其放在MANIFEST文件中,如上所述。

编辑: 这是一个许可问题吗?如果您以root / admin身份运行应用程序或将文件放在其他位置并使用完全限定的路径它是否有效?

答案 3 :(得分:1)

使用MANIFEST文件(META-INF文件夹)处理Classpath条目。使用库的相对路径。

有关详细信息,请查看here

基本上,对于在lib文件夹中使用commons-logging的情况:

Class-Path: lib/commons-logging-1.1.1.jar

对于同一文件夹中的两个罐子:

Class-Path: commons-logging-1.1.1.jar

答案 4 :(得分:1)

感谢大家帮忙解决这个问题。基本上,正在创建清单文件并在我不知情的情况下将其捆绑到jar中,因此忽略了任何$CLASSPATH-cp标志。在我的Eclipse项目中,我将类路径设置为$(projectRoot)/lib,这与我的dist目录完全相同。但是,当它们被OSX的JarBundler捆绑到一个目录中时,该目录不再存在,因此类路径错误!

我尝试从Eclispe创建的Class-Path中删除MANIFEST.MF属性,但命令行$CLASSPATH和/或-cp条目似乎仍然没有区别...清单文件是否存在否定所有命令行类路径条目?

答案 5 :(得分:0)

你有没有将log4j.jar设置到你的班级。我认为你没有将log4j.jar添加到其类路径中。