更新到Java 7后的NoClassDefFoundError

我在执行项目的JAR文件后得到NoClassDefFoundError。 使用Eclipse进行调试工作正常,但每当我使用windows命令java -jar myproject.jar时我都会收到此错误,因为我安装了JDK 1.7。

它使用Java 1.6工作正常。

这是错误日志:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Layout at program.Main.main(Main.java:20) Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Layout at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 1 more 

我搜索了一下,但找不到合适的解决方案。

我已经做了什么:-uninstall Java 1.7,安装1.6而不是在另一台计算机上检查classpath -try(从中卸载Java 1.7之后) – 创建一个空项目,其中一个引用log4j库=>同样的问题

这是classpath文件:

         

你知道我还应该做什么吗?

谢谢,

尼尔斯

编辑:如果我将项目导出为“可运行的JAR”而不是简单的“JAR”,程序启动但无法使用我正在使用的另一个库(RxtxComm)。 这是我得到的日志:

 java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver 

编辑2:我终于通过将rxtxSerial.dll放在Windows / system32文件夹中解决了最后一个问题。 但是,如果我将项目导出为JAR文件以及为什么我现在需要使用dll文件,我仍然不明白为什么它不再起作用。

在运行jar文件时,你确定log4j的jar在classpath中吗? 检查是否:

  • 你有一个CLASSPATH系统变量,其中包含log4j的jar所在的文件夹

  • 在启动jar时传递log4j jar文件夹作为参数

    java -jar yourJar.jar -classpath c:\ myLog4JJarFolder

更新:

根据Andrew Thompson的注释,使用-jar参数会使你的-classpath参数无用(它将被忽略)。 为了能够在命令行指定类路径,您还必须使用主类的完全限定名作为启动参数:

 java -classpath "c:\dir1;c:\dir2" package.subPackage.MainClass 

除了上述内容,我还会检查一些事情:

  • 确保已将所有资源打包在可执行JAR中。 提取你的jar子,看看只是为了确保。

  • 将jar添加到类路径:

    java -cp [jar here] main.java