最终 jar 中 src/main 下的 Maven 包资源文件夹

Maven package resources folder under src/main in final jar

默认情况下,Maven 根据 Standard Directory Layout 检查资源文件夹。虽然最后的jar有问题。

它最终添加了 src/main 文件夹之外的所有资源,这让我的 JavaFX 应用程序变得很糟糕。

Caused by: java.lang.NullPointerException: Input stream must not be null
        at javafx.graphics/javafx.scene.image.Image.validateInputStream(Unknown Source)
        at javafx.graphics/javafx.scene.image.Image.<init>(Unknown Source)
        at main.java.com.goxr3plus.xr3player.application.tools.InfoTool.getImageFromResourcesFolder(InfoTool.java:734)
        at main.java.com.goxr3plus.xr3player.application.Main.start(Main.java:324)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(Unknown Source)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(Unknown Source)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop(Unknown Source)
        ... 1 more

因为我正在从 src/main/resources 文件夹加载图像,例如:

class.getResourceAsStream("/main/resources/image/"+ imageName));

并且在最终的 jar 中,图像文件夹不在主文件夹下。我曾经在 src 文件夹之外有资源文件夹,一切似乎都很好,但我想遵循标准目录布局,所以我移动了它。在一切正常之前使用:

class.getResourceAsStream("/image/"+ imageName));

这是当前的目录布局:


你有什么建议?我应该以不同的方式加载图像吗? ....

现在只有该代码有效 class.getResourceAsStream("/main/resources/image/"+ imageName));

能否以某种方式告诉 Maven 如何将资源文件夹打包到最终的 jar 上?


经过多次重新启动并清理项目和 Maven 更新项目...这似乎是与 Eclipse 相关的问题...没关系,我会把这个问题留在这里,因为它可能对将来的人有用:)

您的 jar 文件看起来像预期的标准布局。

如果你有 src/main/resources/image/imageName.png,它会显示在 jar 文件的 /image/imageName.png 中(在你的屏幕截图中,你确实有那个目录,所以看起来不错)。

你可以用class.getResourceAsStream("/image/imageName.png")加载它。