springboot 打包 failed with MalformedInputException: Input length = 1
MalformedInputException: Input length = 1
是 Spring Boot 项目在打包时常见的错误,通常是由于资源文件(如 .properties
、.yml
或其他文本文件)的编码问题导致的。Maven 在读取这些文件时,如果文件的编码与预期的编码(通常是 UTF-8)不匹配,就会抛出此异常。
以下是解决该问题的详细步骤:
1. 检查文件编码
- 确保
src/main/resources
目录下的所有文件都使用 UTF-8 编码。 - 如果你使用的是 IDE(如 IntelliJ IDEA 或 Eclipse),可以按照以下步骤检查和修改文件编码:
- IntelliJ IDEA:
- 打开
File > Settings > Editor > File Encodings
。 - 将
Global Encoding
、Project Encoding
和Default Encoding for properties files
都设置为UTF-8
。 - 重新保存文件。
- 打开
- IntelliJ IDEA:
2. 在 pom.xml
中配置编码(我在这一步就解决了问题)
在 pom.xml
中明确指定资源文件的编码为 UTF-8。修改 <build>
部分如下:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- 如果需要过滤 -->
<encoding>UTF-8</encoding>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version> <!-- 使用最新版本 -->
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
这样可以确保 Maven 在打包时使用 UTF-8 编码处理资源文件。
3. 排除非 UTF-8 编码的文件
如果某些文件无法转换为 UTF-8 编码(例如二进制文件),可以在 pom.xml
中排除这些文件:
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.bin</exclude> <!-- 示例:排除二进制文件 -->
</excludes>
<filtering>true</filtering>
<encoding>UTF-8</encoding>
</resource>
</resources>
4. 禁用过滤
如果问题是由于资源过滤(例如 ${variable}
占位符)引起的,可以尝试禁用过滤:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering> <!-- 禁用过滤 -->
<encoding>UTF-8</encoding>
</resource>
</resources>
如果只需要对某些文件启用过滤,可以单独配置:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include> <!-- 仅对 properties 文件启用过滤 -->
</includes>
<encoding>UTF-8</encoding>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering> <!-- 对其他文件禁用过滤 -->
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
<encoding>UTF-8</encoding>
</resource>
</resources>
5. 转换文件编码
如果某些文件不是 UTF-8 编码,可以使用工具将其转换为 UTF-8:
- 使用文本编辑器(如 Notepad++ 或 VS Code)打开文件,然后选择
Save with Encoding > UTF-8
。 - 使用命令行工具
iconv
转换编码:iconv -f ISO-8859-1 -t UTF-8 inputfile.properties -o outputfile.properties
6. 检查特殊字符
如果资源文件中包含特殊字符(如非 ASCII 字符),确保它们被正确转义。例如,在 .properties
文件中,可以使用 Unicode 转义序列:
greeting=\u4F60\u597D
7. 更新 Maven 和插件版本
确保你使用的是最新版本的 Maven 和 maven-resources-plugin
。在 pom.xml
中更新插件版本:
<properties>
<maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven-resources-plugin.version}</version>
</plugin>
</plugins>
</build>
8. 清理并重新构建
完成上述修改后,运行以下命令清理并重新构建项目:
mvn clean install
9. 调试模式
如果问题仍然存在,可以使用 Maven 的调试模式查看详细错误信息:
mvn clean install -X
检查日志中是否有具体的文件路径和行号,找到导致问题的文件。
通过以上步骤,你应该能够解决 MalformedInputException: Input length = 1
的问题。如果问题仍未解决,请提供更多错误日志或配置信息,我可以进一步帮助你排查问题!