可怕的java.lang.NoClassDefFoundError

时间:2009-11-09 18:31:21

标签: java eclipse build-process 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使用(包含以下行:<classpathentry kind="lib" path="lib/commons-lang-2.4.jar"/>
  • 这可能与Eclipse工作目录设置有关吗?我有一些我在src / templates下创建的内部模板文件,我可以看到的唯一方法就是将项目工作目录设置为AppName / src。也许我应该把那些放在其他地方?

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

7 个答案:

答案 0 :(得分:13)

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

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

参数/条目的值可以是包含所有.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

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

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

如果您已将应用程序打包到名为myapp.jar的jar文件中,那么运行如下命令将运行您依赖的jar的应用程序,如果您有多个,只需添加它们{{1在Windows上或在Unix上的;

:

如果你只是直接运行这些类,那么运行包含你的java -jar myapp.jar -cp .;c:/pathtolibs/commons-lang-2.4.jar 文件的文件夹也需要在路径上(虽然我认为它已经是因为你能够运行程序并获得错误)。

答案 3 :(得分:1)

考虑文件 - &gt;出口 - &gt; Runnable jar创建一个可以用

直接调用的jar文件
java -jar yourProgram.jar

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

java -cp . MyClass

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

答案 6 :(得分:0)

确保你的jar commons-lang-2.4.jar在类路径中而不是减少。

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