尝试使用java.exe -jar运行我的jar文件时出现NoClassDefFoundError错误...出了什么问题?

11 浏览
0 Comments

尝试使用java.exe -jar运行我的jar文件时出现NoClassDefFoundError错误...出了什么问题?

我有一个应用程序,我正在尝试将其打包成一个jar文件以便于部署。当应用程序作为一组可以从CLASSPATH访问的类在Windows cmd窗口中运行时,它可以编译和运行得很好。但是当我将我的类打包成jar文件,并尝试在相同的cmd窗口中使用java 1.6运行时,我开始收到异常:

C:\dev\myapp\src\common\datagen>C:/apps/jdk1.6.0_07/bin/java.exe -classpath C:\myapp\libs\commons -logging-1.1.jar -server -jar DataGen.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at com.example.myapp.fomc.common.datagen.DataGenerationTest.(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    ... 1 more

有趣的是,有问题的LogFactory似乎在commons-logging-1.1.jar中,而这个jar文件在指定的类路径中。jar文件(是的,它确实在那里):

C:\dev\myapp\src\common\datagen>dir C:\myapp\libs\commons-logging-1.1.jar
 Volume in drive C is Local Disk
 Volume Serial Number is ECCD-A6A7
 Directory of C:\myapp\libs
12/11/2007  11:46 AM            52,915 commons-logging-1.1.jar
           1 File(s)         52,915 bytes
           0 Dir(s)  10,956,947,456 bytes free

commons-logging-1.1.jar文件的内容:

C:\dev\myapp\src\common\datagen>jar -tf C:\myapp\libs\commons-logging-1.1.jar
META-INF/
META-INF/MANIFEST.MF
org/
org/apache/
org/apache/commons/
org/apache/commons/logging/
org/apache/commons/logging/impl/
META-INF/LICENSE.txt
META-INF/NOTICE.txt
org/apache/commons/logging/Log.class
org/apache/commons/logging/LogConfigurationException.class
org/apache/commons/logging/LogFactory$1.class
org/apache/commons/logging/LogFactory$2.class
org/apache/commons/logging/LogFactory$3.class
org/apache/commons/logging/LogFactory$4.class
org/apache/commons/logging/LogFactory$5.class
org/apache/commons/logging/LogFactory.class
...(commons-logging-1.1中的更多类...)

是的,commons-logging有LogFactory类。最后,我的jar文件清单内容:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 10.0-b23 (Sun Microsystems Inc.)
Main-Class: com.example.myapp.fomc.common.datagen.DataGenerationTest
Class-Path: commons-logging-1.1.jar commons-lang.jar antlr.jar toplink
 .jar GroboTestingJUnit-1.2.1-core.jar junit.jar

这个问题困扰了我,以及我已经麻烦了一天以上的同事。至少暂时,由于许可限制和公司政策(例如:用于创建exe文件或打包jar文件的工具)的原因,可能不会考虑第三方解决方案。最终目标是创建一个可以从我的开发Windows桌面复制到Linux服务器(以及所有依赖的jar文件),并用于填充数据库的jar文件(因此在开发和部署环境之间可能会有不同的类路径)。对于这个谜团的任何线索,将不胜感激!

0
0 Comments

问题原因:当使用java.exe -jar命令运行JAR文件时,如果manifest文件中的Class-Path引用了其他JAR文件,并且这些JAR文件在运行时无法被正确加载,就会出现NoClassDefFoundError异常。

解决方法:

1. 右键点击项目,选择导出(Export)。

2. 选择Java文件夹,然后选择Runnable JAR File而不是JAR File。

3. 选择适当的选项,然后在库处理(Library Handling)部分选择第三个选项,即将所需的库复制到生成的JAR文件旁边的子文件夹中。

4. 点击完成,JAR文件将被创建在指定的位置,并且该位置将包含一个文件夹,其中包含manifest文件中引用的JAR文件。

5. 打开终端,给出JAR文件的正确路径,并使用以下命令运行它:java -jar abc.jar。现在,类加载器将在正确的文件夹中查找所引用的JAR文件,因为它们现在位于与应用程序JAR文件相同的文件夹中,这样就不会抛出NoClassDefFoundError异常。

这对我起作用了,希望对你也有效!你的答案是正确的,但是选择第三个选项会生成一个额外的文件夹,我认为选择第二个选项(将所需的库打包进生成的JAR文件中)更好,因为你只需要一个JAR文件。尽管如此,你还是得到了我的投票。

0
0 Comments

在使用java.exe -jar命令运行我的jar文件时出现了NoClassDefFoundError的错误。根据提供的信息,问题的原因是使用了-jar选项,而这个选项与-classpath选项是互斥的。根据Java官方文档的描述,使用-jar选项时,JAR文件是所有用户类的源,其他的用户类路径设置将被忽略。

为了解决这个问题,可以采用一个快速而简单的办法,即将classpath追加到引导类路径中。具体操作是使用-Xbootclasspath/a:路径参数,将路径设置为一个以冒号分隔的目录、JAR文件和ZIP文件的路径。

然而,正如stackoverflow上的一个用户所指出的那样,更正确的解决方法是确保JAR文件的Manifest包含了它所需的所有JAR文件的类路径。在JAR的Manifest中指定类路径会更好,而引导类路径则用于替换系统类。

尽管如此,将完整的路径放入Manifest中在从一个系统部署到另一个系统时可能会遇到困难。因为在两个系统上,这些JAR文件的路径不一定相同。

总结起来,解决NoClassDefFoundError错误的方法有两种:一种是将classpath追加到引导类路径中,另一种是在JAR的Manifest中指定类路径。两种方法各有优劣,根据实际情况选择合适的方法来解决问题。

0
0 Comments

问题的原因是使用-jar选项运行jar文件时出现NoClassDefFoundError错误。解决方法是使用-cp选项来指定类路径,而不是使用-jar选项。

具体解决方法如下:

1. 可以省略-jar选项,直接使用以下命令来启动jar文件:

java -cp MyJar.jar;C:\externalJars\* mainpackage.MyMainClass

这样做可以避免重新编译一个巨大的jar文件,并且确保其依赖项被正确包含。

2. 值得注意的是,这里并没有同时使用-classpath-jar选项。而是使用-classpath选项来接受jar文件和通配符。

-cp选项的用法如下:

- -cp-classpath后面是由冒号分隔的目录、JAR文件和ZIP文件的类搜索路径。

- 可以在路径中使用通配符。

如果在解决问题的过程中遇到了其他困扰,可以参考以下用户的解决方法:

- 有用户在完成解决方案后发现,路径需要用双引号括起来,否则无法正常工作。例如:java -cp "lib\jcommander-1.81.jar;bin" com.aderchox.App --length 512 -p 2

总之,通过使用-cp选项来指定类路径,而不是使用-jar选项,可以解决NoClassDefFoundError错误。

0