当 运行 我的胖罐子使用 AdoptJDK11 时,我的外部依赖项出现 NoClassDefFoundError。怎么了?

I get NoClassDefFoundError on my external dependency when running my fat jar using AdoptJDK11. What is wrong?

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

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

我尝试创建一个胖罐子,但我在使用的外部罐子上收到 NoClassDefFoundError。似乎用户需要在他们的机器上安装 Java。我应该使用不同的 JDK 和 java 本地支持的包装吗?

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

  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

您的错误是由放置外部依赖项的位置引起的。下面这行告诉你的 jar 在哪里寻找你的外部依赖:

<systemPath>${pom.basedir}/src/main/resources/libs/enttoolkit.jar</systemPath>

请注意它在 basedir(您的主应用程序 jar 所在的位置)中的外观,然后它正在寻找一个“src”文件夹,其中包含一个名为“main”的文件夹,其中包含一个名为“resources”的文件夹。 ...其中包含一个名为“enttoolkit.jar”的 jar。

您可以通过几种方式解决这个问题,首先,您可以创建在依赖项中指定的文件夹结构,或者第二种,您可以修复依赖项路径,直接在与主 jar 相同的目录或指向的其他路径中查找您放置 enttoolkit.jar 文件的确切位置:

<systemPath>${pom.basedir}/enttoolkit.jar</systemPath>

如果它在 libs 文件夹中而不是与你的 fat jar 相同的文件夹中:

<systemPath>${pom.basedir}/libs/enttoolkit.jar</systemPath>

第三,您可以在应用程序启动时使用类加载器在代码中执行此操作,而不是依赖于您的 pom 文件。

文件夹结构我已经有了,依赖也有了,还是不行。所以我添加了一个带有 class 路径的 Manifest 文件,并将依赖项复制到与我的主 jar 相同的目录,并且它起作用了。