2012-09-11 29 views
1

执行我的项目的JAR文件后,我收到NoClassDefFoundError。 使用Eclipse进行调试可以正常工作,但是自从我安装JDK 1.7以来,每次使用Windows命令java -jar myproject.jar时都会出现此错误。更新到Java 7之后的NoClassDefFoundError

它使用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 

我用Google搜索有关,但无法找到合适的解决方案。

我已经做了: -uninstall的Java 1.7,安装1.6,而不是 -check的其他计算机上的类路径 - 尝试用一个参考 - 创建一个空的项目将log4j(从它卸载Java 1.7后)库=>同样的问题

而这里的类路径文件:

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
<classpathentry kind="src" path="src"/> 
<classpathentry kind="con"path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> 
<classpathentry kind="lib" path="lib/RXTXcomm.jar"/> 
<classpathentry kind="lib" path="lib/log4j-1.2.15.jar"/> 
<classpathentry kind="output" path="bin"/> 
</classpath> 

你有任何想法,我应该做些什么?

感谢,

尼尔斯

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

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

EDIT2:我终于通过将rxtxSerial.dll在Windows/system32文件夹下解决的最后一个问题。 但是,我不明白为什么它不工作了,如果我导出我的项目作为JAR文件,为什么我需要现在使用dll文件。

+1

你见过这个问题http://stackoverflow.com/questions/502960/eclipse如何构建一个可执行文件jar与外部jar? – user1516873

+0

将其导出为可运行的JAR文件,而不是简单的JAR文件接口可以工作。我得到另一个错误,但程序启动并在屏幕上打印内容。 –

+0

我得到它与可运行的JAR一起工作。谢谢;-) –

回答

2

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

  • 你有一个包含,除其他外一个CLASSPATH系统变量,wher的log4j的JAR位于

  • 的文件夹您传递log4j的JAR文件夹作为参数启动罐子

    Java的罐子yourJar.jar -classpath C:\ myLog4JJarFolder

UPDATE:

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

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

'java -jar yourJar.jar -classpath c:\ myLog4JJarFolder'如果指定了'-jar','-classpath'选项将被忽略。 –

+0

Doh,你是对的,我会更新我的anwer,但也留下像我这样的其他天才的原创。 –

+0

我照你说的去做了。我走进项目的bin文件夹,并推出了类: 的java -classpath “C:\ Documents和Settings \尼尔斯\工作区\ Transcodeur2.1的\ src>的java -classpath” C:\ Program Files文件\的Java \ jdk1.6.0_34 \ LIB \ log4j的-1.2.15.jar” fr.sncf.transcodeur.Main ,但我得到这样的:在线程 异常 “主要” java.lang.NoClassDefFoundError:FR/SNCF/transcodeur /主营 我也试图加入“.class”文件扩展名(.. .Main.class),它没有改变任何东西。 顺便说一句,我不是很舒服的使用控制台(这就是你使用IDE ..!),所以。我可能会误解你 –

0

除了以上几件事情,我会检查:

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

  • 的jar添加到classpath:

    java命令[这里罐子] main.java

+0

我检查了JAR文件,一切都在那里(“LIB”与所有的librairies + .class文件夹) 通过执行java命令的命令,我得到的错误: 异常螺纹“main”java.lang .NoClassDefFoundError:Transcodeur2/1 \ src \ fr \ sncf \ transcodeur \ Main/java 导致:java.lang.ClassNotFoundException:Transcodeur2.1 \ src \ fr \ sncf \ transcodeur \ Main.java 路径应该是正确的,因为我复制/粘贴它从Windows资源管理器 –

+0

我需要两件事情。 1:您正在运行java命令的当前工作目录,以及2:您使用的命令(例如,java -cp /src/main/lib/myjar.jar main.java –