【问题标题】:The dreaded java.lang.NoClassDefFoundError可怕的 java.lang.NoClassDefFoundError
【发布时间】:2010-12-14 17:49:13
【问题描述】:

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

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

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

【问题讨论】:

  • 你的命令行脚本是什么样的?您必须在此脚本中明确设置类路径。
  • 能否请您显示您输入的命令行命令以运行应用程序?
  • 我还没有脚本,但请参阅下面我对 BalusC 的评论,了解我现在正在使用的命令(工作但现在获得权限被拒绝)。

标签: java eclipse build-process noclassdeffounderror


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    确保您的 jar commons-lang-2.4.jar 在类路径中而不是冗余。

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

    【讨论】:

      【解决方案3】:

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

      你通常可以去你的项目bin目录做:

      java -cp . MyClass
      

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

      【讨论】:

        【解决方案4】:

        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 -cp bin;lib/commons-lang-2.4.jar bin/AppName - 现在我得到“lib/commons-lang-2.4.jar: Permission denied”??
        • @bmoeskau:这更像是操作系统级别的限制。检查文件权限。
        • 是的,我知道 :) 对罐子有什么要求?他们需要执行权限吗?看起来默认情况下它有 -rw-r--r--
        • @bmoeskay: chmod 755 应该没问题。
        • 我应该提到我在 Mac (unix) 上。安全错误是因为它实际上试图错误地执行 jar。 Unix 需要 : 而不是 ;作为路径分隔符。这似乎有效: java -cp bin:lib/commons-lang-2.4.jar AppName 我现在遇到了另一个错误,但我认为这解决了我原来的问题,所以我接受你的回答。谢谢!
        【解决方案5】:

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

        java -jar yourProgram.jar
        

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

        【讨论】:

        • 我实际上也尝试过,但在这种情况下,我收到一个错误(来自我的应用程序内部),无法找到我的自定义模板文件夹(在 Eclipse 中的 /src 下)。不确定资源路径如何与 jar 一起使用。
        • 实际上,我发现我需要使用 getResource() 来访问我的模板文件——更改了代码,尝试导出为 jar,现在效果很好!我可能会走这条路,谢谢你的信息。
        • 如果你想要类路径中的东西,使用 getResource 或 getResourceAsStream。请注意,如果您想使用 Java Web Start,这是一个必需的步骤。
        【解决方案6】:

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

        如果您已将应用程序打包到名为 myapp.jar 的 jar 文件中,则运行如下命令将使用您所依赖的 jar 运行应用程序,如果您有多个 jar,只需在 Windows 上添加它们,并以 ; 分隔或 : 在 Unix 上:

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

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

        【讨论】:

          【解决方案7】:

          Eclipse 不会将类路径中的任何 jar 移动到项目的 bin 文件夹中。您需要将 util jar 复制到 bin 文件夹中。如果将其移动到 bin 文件夹的根目录,则可能无需任何类路径条目即可逃脱,但这不是推荐的解决方案。请参阅 @BalusC 的 answer 了解相关内容。

          【讨论】:

            猜你喜欢
            • 2011-04-07
            • 2013-08-10
            • 1970-01-01
            • 2020-11-25
            • 2018-08-23
            • 2023-03-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多