引用库时的NoClassDefFoundError

时间:2013-02-10 00:28:28

标签: java exception noclassdeffounderror

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

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

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

很明显,当我创建.jar时,它无法引用它所需的classifier4j库。

我尝试过的事情:

- 配置我的构建路径

- 更改清单文件

- 使用我的.jar

打包.jar

-in eclipse转到文件> export> java> runnable .jar然后引用库

以及许多其他事情,没有任何效果。

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

提前致谢

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

  

用我的.jar

打包.jar

这似乎意味着您正在尝试创建一个包含所有依赖JAR的“可执行JAR”......按原样。这不起作用,“可执行JAR”不能包含其他JAR。 (嗯,可以......但是你不能把它们放在你的应用程序的类路径上,而不会做很复杂的事情。)

基本上,您有两种选择:

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

    < / LI>
  • 通过将应用程序JAR和所有依赖JAR扩展到单个目录中,然后从该批次创建单个JAR(具有合适的Manife)来创建所谓的“uber-JAR”。您的构建工具或IDE 可能通过某个插件支持此功能。

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


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

  

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

行。您之前应该提到过,因为它是关键信息。为了使JAR文件可以在Web容器中使用(即在与Tomcat相同的JVM中),Web容器中必须有JAR文件及其所有相关JAR文件的副本目录树。有两种选择。您可以将它们放在webapp的lib目录(即webapp / WEB-INFO / lib)中,也可以将它们放在共享库目录中......这取决于您使用的是哪个版本的Tomcat。

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

答案 2 :(得分:0)

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

最可能出现的两个问题是 -

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

在你的情况下,当你遇到问题时,你很可能会在编译过程中选择其他jar(和不兼容的)版本,而不是环境。

答案 3 :(得分:0)

好好看了几个小时的问题后我终于找到了解决方案,当我把我的类作为.jar文件输出时,我把它指向我的清单文件。我找不到我做错了什么,因为它不起作用。我决定查看实际放入jar中的内容,然后我看到eclipse没有放入正确的清单文件,我将它放入jar中。这是一个新的看起来像:

 Manifest-Version: 1.0 

应该看起来像:

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

其中lib文件夹是我的jar所在的目录。现在一切都很完美。谢谢你的帮助。