<nonFilteredFileExtensions> 用于在 Maven 开启全局资源过滤时,豁免指定后缀的文件,不对其进行变量替换与编码转换,防止二进制文件损坏。
1. 核心原理
1.1. 资源过滤(Filtering)
当你在 pom.xml 中设置:
xml
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- 开启全局过滤 -->
</resource>
</resources>
Maven 会在打包时,扫描所有文本文件(.properties/.xml/.yml 等),替换 ${xxx}占位符为实际值。
1.2. 风险:二进制文件被破坏
若对 .doc/.xls/.pdf/.jpg/.zip等二进制文件执行同样操作,会:
-
误解析二进制内容为文本
-
破坏文件结构、编码、校验和打包后文件打不开、损坏、体积异常
1.3. <nonFilteredFileExtensions> 的作用
全局开启 filtering=true 时,白名单豁免指定后缀:
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<!-- 这些后缀的文件:只复制、不过滤、不替换、不改编码 -->
<nonFilteredFileExtensions>
<nonFilteredFileExtension>doc</nonFilteredFileExtension>
<nonFilteredFileExtension>ttc</nonFilteredFileExtension>
<nonFilteredFileExtension>docx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
→ 只原样复制,不做任何文本处理
2. 常见需要豁免的后缀(建议补充)
-
文档:
doc, docx, xls, xlsx, ppt, pdf -
图片:
jpg, png, gif, bmp, ico, svg -
压缩 / 二进制:
zip, rar, 7z, tar, gz -
证书 / 密钥:
crt, pem, p12, pfx, jks, keystore -
其他:
exe, dll, so, jar, class
3. 与 <exclude> 的区别
-
<nonFilteredFileExtensions>:包含但不处理(复制到 target/classes,但不过滤) -
<exclude>:完全排除(不复制到 target/classes)
4. 完整正确结构
xml
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
<includes>
<include>**/*.*</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<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>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.18</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<encoding>UTF-8</encoding>
<useDefaultDelimiters>true</useDefaultDelimiters>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>doc</nonFilteredFileExtension>
<nonFilteredFileExtension>ttc</nonFilteredFileExtension>
<nonFilteredFileExtension>docx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>