Maven 3.9.1构建失败:二进制文件过滤触发MalformedInputException
问题分析
Maven 3.9.x 对maven-resources-plugin的默认配置做了调整,默认会对所有资源文件启用过滤逻辑,包括二进制文件(比如图片、jar包、二进制配置文件等)。而过滤逻辑是基于文本编码解析文件内容的,二进制文件包含非文本编码的字节,因此触发MalformedInputException错误。
解决方案
1. 精准排除二进制文件的过滤
在项目pom.xml中针对maven-resources-plugin配置,明确指定不需要过滤的二进制文件类型:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.0</version> <configuration> <!-- 根据项目实际二进制文件类型添加扩展名 --> <nonFilteredFileExtensions> <nonFilteredFileExtension>png</nonFilteredFileExtension> <nonFilteredFileExtension>jpg</nonFilteredFileExtension> <nonFilteredFileExtension>gif</nonFilteredFileExtension> <nonFilteredFileExtension>ico</nonFilteredFileExtension> <nonFilteredFileExtension>jar</nonFilteredFileExtension> <nonFilteredFileExtension>zip</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin> </plugins> </build>
该方式仅对文本文件启用过滤,二进制文件直接复制,不会触发编码解析错误。
2. 关闭全局资源过滤(按需使用)
如果项目中没有需要变量替换的文本资源,可直接关闭全局过滤:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> </resource> </resources> </build>
注意:若存在application.properties这类需变量替换的文本文件,此方式会导致变量替换失效,需谨慎使用。
3. 分目录管理资源(推荐跨平台方案)
将文本资源与二进制资源分开存放,例如:
src/main/resources/text:存放需过滤的文本文件(如application.properties)src/main/resources/bin:存放二进制文件
然后在pom.xml中分别配置:
<build> <resources> <!-- 文本资源启用过滤 --> <resource> <directory>src/main/resources/text</directory> <filtering>true</filtering> </resource> <!-- 二进制资源禁用过滤 --> <resource> <directory>src/main/resources/bin</directory> <filtering>false</filtering> </resource> </resources> </build>
此方式逻辑清晰,跨平台兼容性最佳,可彻底避免二进制文件被误处理的问题。
验证
配置完成后执行mvn clean install重新构建,验证错误是否解决。若仍有问题,检查是否遗漏二进制文件扩展名或目录配置是否正确。
内容的提问来源于stack exchange,提问作者Stephen G Tuggy
相关产品推荐
相关产品推荐

