运行jar时java.lang.NoClassDefFoundError

时间:2014-03-19 22:20:16

标签: java jar noclassdeffounderror

我使用SLF4J记录器。 jar文件放在../lib目录中。应用程序是使用maven和Netbeans创建的。但是我想自己做所有自学。

应用程序是用命令编译的(当然,在分号后面没有空格 - 为了更好的可读性,我添加了它们):

javac -cp ../lib/poi-3.10-FINAL-20140208.jar;
  ../lib/slf4j-api-1.7.6.jar;
  ../lib/slf4j-log4j12-1.7.6.jar;
  ../lib/commons-io-1.4.jar 
-d target/classes src\main\java\pl\alden\convertcosts\*.java

我可以用

运行它
java -cp ../lib/poi-3.10-FINAL-20140208.jar;
  ../lib/slf4j-api-1.7.6.jar;
  ../lib/slf4j-log4j12-1.7.6.jar;
  ../lib/commons-io-1.4.jar;
  ../lib/log4j-1.2.17.jar;
  target/classes
  pl/alden/convertcosts/App

我知道我可以将所有jar文件设置为cl classpath系统变量(Windows 7)。

我想将所有内容放入jar并从此jar运行它。要创建jar我使用

jar cvfm convertcosts.jar manifest.mf -C target/classes/ .

我有适当的jarjar tf convertcosts.jar给予

META-INF/
META-INF/MANIFEST.MF
.netbeans_automatic_build
log4j.properties
pl/
pl/alden/
pl/alden/convertcosts/
pl/alden/convertcosts/App.class
pl/alden/convertcosts/ConvertCostsException.class
...

现在我想从bat文件运行应用程序:

set classpath=../lib/poi-3.10-FINAL-20140208.jar;
  ../lib/slf4j-api-1.7.6.jar;
  ../lib/slf4j-log4j12-1.7.6.jar;
  ../lib/commons-io-1.4.jar;
  ../lib/log4j-1.2.17.jar
java -jar convertcosts.jar

因此我有

Exception in thread "main" java.lang.NoClassDefFoundError: 
  org/slf4j/LoggerFactory
  at pl.alden.convertcosts.App.<clinit>(App.java:10)

对我看来,主jar文件看不到库jar文件。

我应该改变什么?

1 个答案:

答案 0 :(得分:0)

最好坚持使用显式命令行类路径定义:

java -cp ../lib/poi-3.10-FINAL-20140208.jar;
  ../lib/slf4j-api-1.7.6.jar;
  ../lib/slf4j-log4j12-1.7.6.jar;
  ../lib/commons-io-1.4.jar;
  ../lib/log4j-1.2.17.jar
  -jar convertcosts.jar

定义classpathCLASSPATH环境变量会产生系统范围的影响,您应该知道并非所有Java应用程序都需要在其类路径上使用这些特定的jar。如果你真的必须,那么在定义../lib/的值时,至少要使用完整路径而不是CLASSPATH