.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>
我有一个带有子模块的 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>