在使用 this.getClass().getClassLoader().getResourceAsStream() 读取项目目录路径下的文件需要注意 在pom.xml 文件中加入
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
</plugins>
</build>
在 Maven 项目中,尤其是当涉及到 Spring Boot 应用程序时,this.getClass().getClassLoader().getResourceAsStream()
方法通常用于从类路径(classpath)中加载资源文件。这些资源文件通常位于项目的 src/main/resources
目录下,因为 Maven 默认会将这个目录下的所有内容复制到构建的输出目录(例如 target/classes
)中,并作为类路径的一部分。
关于你提到的 pom.xml
文件中的配置,有几个关键点需要解释:
-
Spring Boot Maven 插件 (
spring-boot-maven-plugin
):- 这个插件是 Spring Boot 项目所必需的,它提供了许多有用的功能,如打包可执行 JAR 或 WAR 文件、管理主类的位置等。但是,对于你提到的资源文件加载,这个插件本身并不直接涉及。
-
Maven 资源插件 (
maven-resources-plugin
):- 这个插件用于处理 Maven 项目中的资源文件。默认情况下,它会复制
src/main/resources
目录下的所有文件到输出目录。 <nonFilteredFileExtensions>
配置是用来指定哪些文件扩展名在资源过滤过程中应该被忽略。资源过滤是一个 Maven 功能,允许你在资源文件中使用 Maven 属性(如${project.version}
),并在构建过程中用实际的属性值替换它们。但是,有些文件(如 Excel 文件.xlsx
或.xls
)不应该被过滤,因为它们包含二进制数据而不是文本。因此,你添加了这些扩展名以确保它们不会被错误地处理。
- 这个插件用于处理 Maven 项目中的资源文件。默认情况下,它会复制
为什么需要这些配置来加载资源文件?
实际上,你提到的这些配置与直接使用 this.getClass().getClassLoader().getResourceAsStream()
加载资源文件并没有直接的关系。但是,确保资源文件被正确地复制到输出目录(并因此成为类路径的一部分)是使用该方法的前提。
如果你的资源文件(如 Excel 文件)位于 src/main/resources
目录下,并且你没有对它们进行任何特殊的 Maven 过滤配置,那么这些配置可能不是必需的。但是,添加 <nonFilteredFileExtensions>
配置是一个好习惯,以确保你的二进制资源文件不会被错误地处理。
总之,确保资源文件位于正确的位置(通常是 src/main/resources
),并且它们被正确地复制到输出目录,是使用 this.getClass().getClassLoader().getResourceAsStream()
方法加载它们的关键。
标签:文件,getResourceAsStream,getClass,getClassLoader,Maven,报错,resources,资源 From: https://www.cnblogs.com/jabez1992/p/18260656