首页 > 解决方案 > 使用 AdoptJDK11 运行我的胖 jar 时,我的外部依赖项出现 NoClassDefFoundError。怎么了?

问题描述

我有一个使用 JDK 11 构建的 JavaFX 11/13 应用程序。要求用户无需下载 java 即可使用 JavaFX 应用程序。此外,我还使用了一个已定义为外部依赖项的外部 jar。

我的 JavaFX11 项目的其他规格如下:

我尝试创建一个胖 jar,但在我使用的外部 jar 上出现 NoClassDefFoundError。似乎用户需要在他们的机器上安装 Java。我应该使用原生支持 java 打包的不同 JDK 吗?

我打包应用程序的步骤如下:

  1. 我定义了对我的 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>
    
  2. 在 libs 文件夹中添加了依赖项 在此处输入图像描述

  3. 我使用以下命令编译了我的 javafx 项目:mvn package

  4. 然后,我使用以下命令运行 myapp jar:java -jar myapp.jar 在此处输入图像描述

标签: javajavafx

解决方案


您的错误是由您放置外部依赖项的位置引起的。以下行告诉您的 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 文件。


推荐阅读