好吧我整天都在网上搜索,我已经尝试了所有我看过的内容,所以我想知道是否有人可以提供帮助。
我有一个类,它引用了一个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完成吗?
提前致谢
杰
答案 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
将被忽略!)
通过将应用程序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所在的目录。现在一切都很完美。谢谢你的帮助。
杰