failed with MalformedInputException: Input length = 1 -> 修复解决方案
-
- [1.1 案发现场](#1.1 案发现场)
- [1.2 分析诊断](#1.2 分析诊断)
- [1.3 解决方案](#1.3 解决方案)
1.1 案发现场
最近把一个服务spring boot版本升级到了2.7.18,以及JDK升级到了JDK17, 结果服务打包报错:
bash
failed with MalformedInputException: Input length = 1 ->
报错详情如下:
bash
[INFO] Copying 57 resources
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.407 s
[INFO] Finished at: 2024-09-10T19:39:11+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.3.0:resources (default-resources) on project xxx: filtering C:\Users\xxx\Documents\workspace\IdeaProjects\xxx\xxx\src\main\resources\cert\pfx_cert\xxx.pfx to C:\Users\xxx\Documents\workspace\IdeaProjects\xxx\xxx\target\classes\cert\pfx_cert\xxx.pfx failed with MalformedInputException: Input length = 1 -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
1.2 分析诊断
经过一番分析和排查发现,最终发现是由于src\main\resources
目录下有一些证书文件的字符存在不合法的UniCode字符导致的。
但是由于是证书文件,不方便修改,因此只能通过其他途径绕过这个检测来避免报错。
方法如下:
- 在 pom.xml 中查看是否启用了 filtering:
xml
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
- 如果果启用了过滤,确保你的 properties 文件没有包含不合法的 Unicode 字符。
- 如果有,可能需要手动修复这些字符或禁用过滤。
经过排查,发现少注释了<filtering>true</filtering>
xml
<!-- 本地运行需要注释下面内容 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<!-- <excludes>-->
<!-- 排除各个环境下的配置文件 -->
<!-- <exclude>*/*</exclude>-->
<!-- K8S部署加载的是/opt/SpringCloud/app/xxx/config目录的配置文件 -->
<!-- <exclude>*.*</exclude>-->
<!-- 仅用于开发时候用插件生成src/gens/java下的代码,打包时不需要打包 -->
<!-- <exclude>generator/**</exclude>-->
<!-- K8S部署加载的是/opt/SpringCloud/app/xx/cert/** 的证书文件 -->
<!-- <exclude>cert/**</exclude>-->
<!-- </excludes>-->
</resource>
</resources>
<!-- 本地运行需要注释上面内容 -->
1.3 解决方案
把<filtering>true</filtering>
也注释掉。
xml
<!-- 本地运行需要注释下面内容 -->
<!-- <resources>-->
<!-- <resource>-->
<!-- <directory>src/main/resources</directory>-->
<!-- <filtering>true</filtering>-->
<!-- <excludes>-->
<!-- 排除各个环境下的配置文件 -->
<!-- <exclude>*/*</exclude>-->
<!-- K8S部署加载的是/opt/SpringCloud/app/xxxx/config目录的配置文件 -->
<!-- <exclude>*.*</exclude>-->
<!-- 仅用于开发时候用插件生成src/gens/java下的代码,打包时不需要打包 -->
<!-- <exclude>generator/**</exclude>-->
<!-- K8S部署加载的是/opt/SpringCloud/app/xxxx/cert/** 的证书文件 -->
<!-- <exclude>cert/**</exclude>-->
<!-- </excludes>-->
<!-- </resource>-->
<!-- </resources>-->
<!-- 本地运行需要注释上面内容 -->
至此,问题修复,再次打包就正常了~