.getResource("/filename") returns 当maven打包为pom时为null

.getResource("/filename") returns null when maven packaging is pom

我有一个带有子模块的 Maven 项目,使用 Java 11.

在 IntelliJ 中开发

除非pom.xml文件包含<packaging>pom</packaging>,否则会出现警告

'packaging' with value 'jar' is invalid. Aggregator projects require 'pom' as packaging.

但是当打包设置为“pom”时,我需要的资源文件加载不出来;返回空值,并抛出异常。来自 main() 方法:

    URL resource = getClass().getResource("/fx/gui.fxml");
    Objects.requireNonNull(resource);

另一方面,有时找不到子模块,除非我要求pom打包。然后我做的是:请求 pom 打包,启动程序并观察它失败,从 pom.xml 中删除 pom 打包语句,重新启动并且程序运行。

我的资源文件在标准位置src/main/resources/fx/gui.fxml。 pom文件中也给出了这个位置:

<build>
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>${project.basedir}/src/main/resources</directory>
        </resource>
    </resources>
</build>

请帮助我了解发生了什么。是否需要pom打包,资源如何加载?

看起来你的源代码在你的父 pom 中。

父 pom(带有子模块)必须有 pom 包装并且不能有 java 源代码。参见 this question

您应该将代码移到新的子模块中。

包含源代码的项目或模块必须根据您的要求进行 jar/war 的包装。不能打包成pom.通常,当您具有多模块项目结构并且子模块将包装为 jar/war 时,pom 包装与父模块一起使用。所以在你的情况下,如果你有多模块项目结构,你的父包装将是“pom”并且所有子模块(包含源代码)必须有 jar/war。注意:您的父模块不应该有源代码,如果有,则将您的源代码移至子模块。多模块项目结构基本上用于存在共同依赖关系的地方,并且可以在多个子模块中使用工件,以便可以删除重复项。 如下所示。

parent pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.abc.test</groupId>
    <artifactId>testartifact</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <java.version>1.8</java.version>
    </properties>

     <modules>
        <module>rest-services</module>
     </modules>

</project>

Submodule pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.abc.test</groupId>
        <artifactId>testartifact</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <artifactId>rest-services</artifactId>
    <name>rest-services</name>
 
    <dependencies>
        <dependency>
        </dependency>
    </dependencies>

 </project>