【问题标题】:NoClassDefFoundError when referencing library引用库时出现 NoClassDefFoundError
【发布时间】:2013-02-10 00:28:28
【问题描述】:

好的,我整天都在网上搜索,我已经尝试了我所看到的一切,所以我想知道是否有人可以提供帮助。

我有一个类引用了一个 jar 文件,我已将它复制到我的工作区的 lib 文件夹中,jar 是:Classifier4J.jar,我的类在控制台上完美运行,完全没有错误。当我尝试将 .jar 打包在一起并从另一个程序运行 .jar 时,它给了我这个错误:

    Exception in thread "pool-2-thread-1" java.lang.NoClassDefFoundError: net/sf/classifier4J/bayesian/IWordsDataSource...(10 more)

很明显,当我创建 .jar 时,它无法引用它需要的分类器 4j 库。

我尝试过的事情:

-配置我的构建路径

-更改清单文件

-用我的 .jar 打包 .jar

-在 eclipse 中转到 file>export>java>runnable .jar 然后引用库

还有很多其他的东西,但没有任何效果。

如果无论如何有类似的问题或知道为什么会发生这种情况,请你帮我看看这真的让我头疼。这是eclipse的问题吗?可以通过eclipse来完成吗?

提前致谢

【问题讨论】:

  • 你能在 eclipse 中运行应用程序吗?
  • @NishantShreshth 是的,应用程序在 Eclipse 中完美运行,只是当我尝试将其添加到 .jar 文件并在另一个应用程序中使用它时,它给了我这个错误。
  • 当您使用 eclipse 将其导出为可运行的 jar 时,请选择选项“将所需的库复制到生成的 jar 旁边的子文件夹中”。现在看看依赖项是否真的结束了。
  • @NishantShreshth 最终出现在 .jar 旁边的正确位置,这种方法的问题是它会将每个库复制到该目的地,我只想要 classifer4j 库。
  • 理想情况下,它应该只复制您在 Eclipse 中定义为项目依赖项的那些库。您可以通过使用 eclipse 配置构建路径来删除不需要的库。之后尝试导出。

标签: java exception noclassdeffounderror


【解决方案1】:

好吧,经过几个小时的研究,我终于找到了解决方案,当我将我的类输出为 .jar 文件时,我将它指向了我的清单文件。我找不到我做错了什么,因为它不起作用。我决定查看实际放入 jar 中的内容,发现 eclipse 没有将我要求的正确清单文件放入 jar 中。它正在放置一个新的,看起来像:

 Manifest-Version: 1.0 

它应该是这样的:

 Manifest-Version: 1.0
 Class-Path: ../lib/Classifier4J.jar

lib 文件夹所在的位置是我的 jar 所在的目录。现在一切正常。感谢您的所有帮助。

【讨论】:

    【解决方案2】:

    特定的库不包含在您的 jar 中。您可以尝试修复 Eclipse 构建配置以包含该库,或者在运行程序时将库的 jar 添加到类路径中。
    后者可能更容易。只需在执行程序时将以下内容添加到命令中。

    java -cp yourjar.jar;thelibrarysjar.jar com.your.Mainclass
    

    【讨论】:

      【解决方案3】:

      您需要了解 NoClassDefFoundError 几乎不意味着找不到已识别的类。更常见的情况是,找到了该类,但有些东西阻止了它被成功加载。

      两个最可能的问题是 -

      • 其他一些缺失的类会阻止命名类被“验证”。
      • 由于在编译和执行中使用了不同版本的类(通常是另一个类)而导致一些不兼容。

      在您的情况下,当您遇到问题时,很可能是在编译期间选择了其他 jar 的不同(且不兼容)版本,而不是环境。

      【讨论】:

        【解决方案4】:

        很难理解你真正想要做什么,你实际尝试过什么,以及你期望做什么,但我认为线索就在这里:

        用我的 .jar 打包 .jar

        这似乎暗示您正在尝试创建一个包含所有相关 JAR 的“可执行 JAR”......按原样。那行不通,“可执行 JAR”不能包含其他 JAR。 (当然可以……但是如果不做非常复杂的事情,就不能将它们放在应用程序的类路径中。)

        基本上,您有两种选择:

        • 不要尝试在您的(可执行或不可执行的)应用程序 JAR 中包含相关 JAR。将它们分开,并配置执行类路径以包含它们。 (请注意,对于可执行 JAR,执行类路径必须配置为 Manifest 条目。如果使用 java -jar ...,则 -cp argument$CLASS_PATH 将被忽略!)

        • 通过将应用程序 JAR 和所有相关 JAR 分解到单个目录中,然后从批次中创建单个 JAR(带有合适的清单)来创建所谓的“uber-JAR”。您的构建工具或 IDE可能通过一些插件对此提供支持。

        我个人更喜欢前一种方法……结合应用程序的“安装目录”和包装脚本。使用后一种方法,用户(或部署者)很难混合和匹配依赖 JAR 的版本。此外,“uber-JAR”方法可能与第 3 方库的许可证冲突。


        最后,也许我们可以到达某个地方

        .... .jar 文件是从 tomcat 应用程序运行的,它是所有日志文件的简单适配器。

        好的。您之前应该提到过,因为它是一条关键信息。为了使 JAR 文件在 Web 容器中可用(即在与 Tomcat 相同的 JVM 中),必须在 Web 容器的目录树。有两种选择。要么将它们放在 webapp 的 lib 目录中(即 webapp/WEB-INFO/lib),要么将它们放在共享库目录中……这取决于你使用的 Tomcat 版本。

        (“可执行 JAR”方法在这里不起作用。您放入 Manifest 的类路径内容无关紧要。嵌套 JAR 文件也不起作用。)

        【讨论】:

        • 我已经像这样配置了清单文件:Manifest-Version: 1.0 Class-Path: lib/classifer4j.jar
        • 仍然不够详细。你需要准确地描述你所做的一切。依赖关系是什么,您是如何创建 JAR 的,文件彼此相关的位置,您尝试运行它的方式。
        • 好的,我会尽力提供尽可能多的细节 我已经创建了一个 .jardesc 文件来创建我的 jar 文件 我运行它,它问我想要包含什么我选择 .classpath,。项目,myclass.java,然后我选择我之前描述的清单文件,然后单击完成。 classifiier4j.jar 文件位于我项目的 /lib 文件夹中,我已将其包含在构建路径中,因此在创建 .jar 文件时应该引用它对吗? .jar 文件是从 tomcat 应用程序运行的,它是所有日志文件的简单适配器。如果您需要更多信息,感谢您的帮助。
        猜你喜欢
        • 1970-01-01
        • 2011-07-14
        • 2023-03-08
        • 2016-03-11
        • 2018-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多