我正在尝试将我的程序导出为可运行的 JAR,一切在 Eclipse 中运行良好。我检查了以下内容:
- 将我的库中的所有 jar 包含在
Java 构建路径
下 - 在
订单和导出
下检查了所有内容 - 导出时,我选择了
将所需的库打包到生成的 JAR 中
- 当我打开生成的 JAR 时,我可以看到所有其他第 3 方 JAR 都在根目录中
但是,当我运行可运行 JAR 时,我得到以下信息:
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at ca.carillon.jnlp.Launcher.<clinit>(Launcher.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
让我的可运行 JAR 工作的唯一其他方法是选择将所需的库提取到生成的 JAR
,但是我不想提取所有这些 3rd 方 JAR,有人可以告诉我 Eclipse 中还缺少什么吗?
最佳答案
一般有以下三种选择:
- 创建 fat jar/uber jar - 一个包含所有必需依赖项的 jar 文件,不仅可以通过编译,而且还包含运行时所需的依赖项。
- 仅使用您的特定文件创建“普通”jar,并在类路径中提供所有必需的依赖项。
- 介于两者之间的东西:包含一些依赖项,在类路径中提供一些依赖项。 (尽管我认为这有点奇怪。)
对于这种情况,我使用 Gradle 的应用程序插件 ( https://docs.gradle.org/current/userguide/application_plugin.htm ) 创建 fat jar,Maven 也可以使用 ( How can I create an executable JAR with dependencies using Maven? ) 来做到这一点。
无论如何,我建议切换到一些构建工具,因为它也会运行测试等。恕我直言,在 IDE 中创建 jar 是一个相当糟糕的主意,绝对不是长期解决方案。尝试一下 Gradle。这真的很简单。
关于Java NoClassDefFoundError 即使是 "Package required libraries",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42727327/