0

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

我有一个引用 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

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

和许多其他的东西,没有任何效果。

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

提前致谢

周杰伦

4

4 回答 4

2

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

 Manifest-Version: 1.0 

它应该看起来像:

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

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

周杰伦

于 2013-02-10T13:21:01.420 回答
0

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

java -cp yourjar.jar;thelibrarysjar.jar com.your.Mainclass
于 2013-02-10T00:46:31.210 回答
0

很难理解您实际尝试做什么,实际尝试过什么以及您期望工作什么,但我认为线索就在这里:

用我的 .jar 打包 .jar

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

基本上,您有两种选择:

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

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

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


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

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

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

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

于 2013-02-10T01:18:42.240 回答
0

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

两个最可能的问题是 -

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

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

于 2013-02-10T01:46:51.497 回答