可怕的java.lang.NoClassDefFoundError

我已经查看了许多关于此错误的现有线程,但仍然没有运气。 我甚至没有尝试打包或使用任何第三方包装工具。 我只是在Eclipse中运行(效果很好),然后尝试从命令行运行完全相同的应用程序,在它构建的同一位置(收到此错误)。 我的目标是能够压缩bin文件夹并将其发送给其他人通过命令行脚本运行。 一些细节:

  • 它是一个命令行应用程序,我使用commons-lang-2.4.jar作为字符串实用程序。 那是无法找到的文件(具体是“java.lang.NoClassDefFoundError:org / apache / commons / lang / StringEscapeUtils”)
  • 我在我的lib文件夹中有那个jar,并通过右键单击“Build Path – > Add to Build Path”将它添加到我在Eclipse的构建路径中
  • .classpath文件看起来正确并包含对jar的引用,但我认为该文件仅供Eclipse使用(包含以下行:
  • 这可能与Eclipse工作目录设置有关吗? 我有一些我在src / templates下创建的内部模板文件,我能看到的唯一方法就是将项目工作目录设置为AppName / src。 也许我应该把那些放在其他地方?

如果有任何其他信息可以帮助我,请告诉我。 当然这很简单,但此时我浪费了太多时间。 这让我想起为什么我最初在05年左右离开了Java …

NoClassDefFoundError基本上意味着类在编译期间在类路径中存在,但在运行时期间类路径中缺少它。

在您的情况下,当从命令行使用java.exe执行时,您需要在-cp-classpath参数中指定类路径。 或者如果它是JAR文件,则需要在其MANIFEST.MF文件的class-path条目中指定它。

参数/条目的值可以是包含所有.class文件的文件夹的绝对或相对文件系统路径,也可以是单个.jar文件。 您可以使用分号分隔路径; 。 当路径包含空格时,您需要使用双引号包装特定路径" 。示例:

 java -cp .;c:/path/to/file.jar;"c:/spacy path/to/classes" mypackage.MyClass 

为了节省每次在命令行中键入和编辑参数的工作量,请使用.bat文件。

编辑 :我应该已经意识到你正在使用基于Unix的操作系统。 以上示例是针对Windows的。 对于类似Unix的平台,您可以遵循相同的规则,但是您需要使用冒号分隔路径:而不是最终的批处理文件,请使用.sh文件。

 java -cp .:/path/to/file.jar:"/spacy path/to/classes" mypackage.MyClass 

您是否在命令行上指定了java的类路径?

$ java -cp lib / commons-lang-2.4.jar your.main.Class

您在Eclispe中设置的类路径设置仅适用于IDE,不会影响应用程序在IDE外部运行的方式。 即使您使用Eclipsefunction将应用程序导出为可执行jar文件,也没有开箱即用的方法来打包应用程序所依赖的所有jar文件。

如果你已经将应用程序打包到一个名为myapp.jar的jar文件中,那么运行一个如下所示的命令将运行你所依赖的jar的应用程序,如果你有多个只是添加它们的分区; 在Windows上或:在Unix上:

 java -jar myapp.jar -cp .;c:/pathtolibs/commons-lang-2.4.jar 

如果您只是直接运行类,那么运行包含.class文件的文件夹也需要在路径上(虽然我已经假定它已经是因为您能够运行程序并获得错误)。

考虑File – > Export – > Runnable jar来创建一个可以直接调用的jar文件

 java -jar yourProgram.jar 

根据您的需要,有几种变体。

Eclipse不会将类路径中的任何jar移动到项目的bin文件夹中。 您需要将util jar复制到bin文件夹中。 如果将其移动到bin文件夹的根目录,则可以在没有任何类路径条目的情况下离开,但这不是推荐的解决方案。 请参阅@ BalusC的答案以获得对此的良好报道。

Eclipse默认情况下不构建可执行的java类。 不要问我为什么,但它可能与使用自己的tools.jar(在plugins / org.eclipse.core中的某个地方?)有关,这样Eclipse可以在没有JDK的情况下运行。

您通常可以转到项目bin目录并执行以下操作:

 java -cp . MyClass 

但是如果你有外部jar,Eclipse会以另一种奇怪的方式在内部处理它们,所以你也需要添加它们。

确保你的jar commons-lang-2.4.jar在classpath而不是redudance。

我曾经将jar文件添加到我的类路径中,并且在我的类路径中有2个文件jar。 删除后,工作顺利