繁体   English   中英

Java Jar和Classpath问题

[英]Java Jar and Classpath problems

我有一个我无法理解的怪异问题……我有一个用Eclipse构建的简单HelloWorld jar,它的类路径上有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 

并且遇到了与上述相同的错误,我非常感谢您能理解为什么我无法做到这一点和/或如何解决它的任何帮助?

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

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

java -cp yourJar:logJars <mainClass>

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

Java无法与lib / *一起使用,但是shell可能会为您扩展它。 仔细检查一下。 导出后,将这样的一行:

echo $CLASSPATH

另外,我建议将其放在清单文件中,如前所述。

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

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

有关更多信息,请在此处查看

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

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

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

Class-Path: commons-logging-1.1.1.jar

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM