2013-02-10 88 views
0

好,我一直在网上搜索了一整天,我已经试过各种我所看到的,所以我想知道,如果有人可以提供帮助。NoClassDefFoundError的引用库时

我有一个类,引用了我已经在lib文件夹中的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库。

事情我已经尝试:

- 配置我的构建路径

- 改变清单文件

-packaged与我的.jar将.jar

-in蚀去文件>出口>的java>可运行的.jar然后引用库

和许多其他的事情并没有什么工作。

如果反正已经有过类似的问题,或者知道为什么发生这种情况,你可以请帮我它真的冲倒我的头。这是eclipse的问题吗?可以通过日食来完成吗?提前

感谢

周杰伦

+0

您是否可以在eclipse中运行应用程序? – 2013-02-10 00:31:12

+0

@NishantShreshth是的,应用程序在eclipse中完美工作,只是当我尝试将它添加到.jar文件并在另一个应用程序中使用它时,它会给我那个错误。 – hacker9116 2013-02-10 00:33:12

+0

使用eclipse将其作为可运行jar导出时,选择选项“将所需的库复制到生成的jar旁边的子文件夹中”。现在看看依赖关系是否真的在那里结束。 – 2013-02-10 00:45:58

回答

0

好几个小时后,我终于找到了解决方案,当我输出我的类作为一个.jar文件我指出了我的清单文件。我无法找到我做错了,因为它没有工作。我决定看看实际放入jar的内容,并且我看到eclipse并没有把我要求的正确清单文件放入jar中。它是把一个新的,看起来像:

Manifest-Version: 1.0 

,它应该看起来像:

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

其中lib文件夹回来从我的罐子,其中一个目录。现在一切都很完美。谢谢你的帮助。

Jay

0

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

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

这是很难明白你实际上是试图做的,你实际上已经尝试过了,你所期望的工作,但我认为,线索是在这里:

packaged the .jar with my .jar

这似乎暗示您正在尝试创建一个“可执行JAR”,其中包含所有依赖JAR ......。这是行不通的,“可执行JAR”不能包含其他JAR。 (嗯是可以...但你不能把它们放在你应用的classpath没有做认真复杂的事情)

基本上,你有两个选择:

  • 不要试图包括(可执行或不可执行)应用程序JAR中的依赖JAR。保持它们分离,并配置执行类路径以包含它们。爆炸的方式(而且要注意,对于一个可执行的JAR,执行类路径必须被配置为一个清单条目。如果你使用java -jar ...,在-cp argument$CLASS_PATH被忽略!)

  • 创建一个所谓的“超级-JAR”应用程序JAR和所有依赖JAR集成到一个目录中,然后从该目录创建单个JAR(具有适当的Manifest)。您的构建工具或IDE 可能通过某个插件支持此操作。

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


最后,也许我们可以得到的地方

.... the .jar file is ran from a tomcat application its a simple adapter for log files that all.

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

(在“可执行的JAR”的做法不会在这里工作。你把清单中的类路径的东西无关。和筑巢的JAR文件将不能工作。)

+0

我已经配置清单文件像这样: 清单-版本:1.0 类路径:LIB/classifer4j.jar – hacker9116 2013-02-10 01:23:31

+0

还没足够的细节。你需要描述你所做的一切。什么是依赖关系,您如何创建JAR,这些文件是相对于彼此的,您如何尝试运行它。 – 2013-02-10 01:32:43

+0

确定我会尝试,因为我可以 我创建了一个.jardesc文件来创建我的jar文件我运行它给尽可能多的细节,它问我什么,我想包括我选择的.classpath,.project文件,myclass.java,在那之后,我选择我之前描述的清单文件,然后单击完成。 的classifiier4j.jar文件在我的项目/ lib文件夹我已经在构建路径中包含它,所以当我创建了.jar文件正确,应该得到引用? .jar文件从一个Tomcat应用程序运行的日志文件,所有一个简单的适配器。 感谢您的帮助,如果你需要的信息了问。 – hacker9116 2013-02-10 01:47:43

0

您需要了解的NoClassDefFoundError很难永远意味着找不到的类。更常见的是,班级被找到了,但是有些东西阻止了它被成功加载。

两个最有可能的问题是 -

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

就你而言,最有可能的是,当你遇到问题时,你正在编译一些其他jar的版本,而不是编译期间的环境。

相关问题