java - 使用 AdoptJDK11 运行我的胖 jar 时,我的外部依赖项出现 NoClassDefFoundError。怎么了?
问题描述
我有一个使用 JDK 11 构建的 JavaFX 11/13 应用程序。要求用户无需下载 java 即可使用 JavaFX 应用程序。此外,我还使用了一个已定义为外部依赖项的外部 jar。
我的 JavaFX11 项目的其他规格如下:
- 采用JDK版本:11
- JavaFX 版本:13
- 具有由第三方供应商手动(通过邮件)提供的外部依赖项。没有 Maven 回购网址。
- 构建工具:Maven
我尝试创建一个胖 jar,但在我使用的外部 jar 上出现 NoClassDefFoundError。似乎用户需要在他们的机器上安装 Java。我应该使用原生支持 java 打包的不同 JDK 吗?
我打包应用程序的步骤如下:
我定义了对我的 pom 文件的外部依赖,如下所示:
<dependency> <groupId>com.my.toolkit</groupId> <artifactId>mytoolkit</artifactId> <version>8.1.0</version> <scope>system</scope> <systemPath>${pom.basedir}/src/main/resources/libs/mytoolkit.jar</systemPath> </dependency>
我使用以下命令编译了我的 javafx 项目:
mvn package
解决方案
您的错误是由您放置外部依赖项的位置引起的。以下行告诉您的 jar 在哪里查找外部依赖项:
<systemPath>${pom.basedir}/src/main/resources/libs/enttoolkit.jar</systemPath>
请注意它是如何在 basedir(您的主应用程序 jar 所在的位置)中查找的,然后它正在寻找一个“src”文件夹,其中包含一个名为“main”的文件夹,其中包含一个名为“resources”的文件夹 .... 其中包含一个名为“enttoolkit.jar”的罐子。
您可以通过多种方式解决此问题,首先,您可以创建依赖项中指定的文件夹结构,或者两个您可以修复依赖项路径以直接查看与主 jar 相同的目录或指向您放置的确切位置的其他路径enttoolkit.jar
文件:
<systemPath>${pom.basedir}/enttoolkit.jar</systemPath>
如果它位于 libs 文件夹中,而不是与您的 fat jar 相同的文件夹中:
<systemPath>${pom.basedir}/libs/enttoolkit.jar</systemPath>
或者第三,您可以在应用程序启动时使用类加载器在代码中执行此操作,而不是依赖您的 pom 文件。
推荐阅读
- java - 将类与相同类型关联
- docker - 什么是从一个容器到另一个容器的 url 服务?
- angular - 如何根据条件禁用 Mat-tree 组件?
- unit-testing - 使用 jasmine / spyOn 模拟对象的属性
- javascript - 从父级或最近的 div 获取数据值
- java - 如何在 Java 8 中将字符串(例如“01/01/2019”)转换为日期
- java - 如何找到两个日期之间的天数?
- makefile - 在 Makefile 中删除带有配方的目标失败
- python-3.x - 获取数据框字典的特征重要性
- corda - 状态发行的任何样本->更新->在corda中退出