可怕的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。 删除后,工作顺利