【failed with MalformedInputException: Input length = 1 -> 修复解决方案】

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字符导致的。

但是由于是证书文件,不方便修改,因此只能通过其他途径绕过这个检测来避免报错。

方法如下:

  1. 在 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>-->
		<!-- 本地运行需要注释上面内容 -->

至此,问题修复,再次打包就正常了~