本文唯一发布网站 博客园(官网地址:https://www.cnblogs.com/)
本文地址:https://www.cnblogs.com/zeromi/p/17716933.html
前情提要
有天需要写个东西,需要翻一下老代码,使用idea打开一个很久没打开的项目,然后不知道为啥到处飘红
在查看了项目的External Labraries列表,发现包都有,再看下项目jdk设置,没错啊,还是万年的jdk8,mvn设置3.6.3
我尝试了以下办法
1. maven 刷新(重新导入) 无效
2. idea重新导入项目 无效
只能老办法,上百度了,直接复制报错关键信息,"Malformed \uxxxx encoding",在百度的搜索结果里屎里淘金
csdn的搜索结果最靠前,但是大多数只是简单的说了下自己做了啥操作解决了,答案也基本千篇一律,偶尔有个特别的也没说清楚(csdn大部分时候浪费时间简直是)
cnblogs(博客园)只搜到一篇相关,但也没能解决问题
总结下来就是:
删除本地maven仓库里面的 resolver-status.properties和xxxxx.lastupdate文件,这两操作都没能解决问题
后面搜到了stackflow上的这个问题贴,感觉之前看的那些贴都是看了这个帖写的(合理怀疑)
stackflow上的问题贴
(主要我在网上搜到的大多数相关的解决方法基本都在这个帖子中)
https://stackoverflow.com/questions/68003423/java-lang-illegalargumentexception-malformed-uxxxx-encoding-while-mvn-install
apache相关问题帖(stackflow上面说是maven的一个bug)
https://issues.apache.org/jira/browse/MRESOLVER-216
帖子提供的办法:
1. 删除本地maven仓库里面的 resolver-status.properties和xxxxx.lastupdate文件
find ~/.m2/ -name resolver-status.properties -delete
2. 直接删除本地仓库中所有存在该字符的文件或者直接删除本地库中的全部文件(未尝试,不想删除整个本地库重新下载,太浪费时间了)
grep -lrnw /else/where -e '\u0000' | xargs rm
3. 自己debug
根据stackflow的问题帖上评论里的maven debug方法最终找到问题
我的问题排查过程
1. 首先需要确定问题原因:
在idea里面使用mvn compile -X,-X表示打印debug日志,重现一下错误,根据打印日志,确定是读取某个文件出现错误
2. 找到这个文件:
根据maven编译的打印日志从子模块bus开始报错,然后中断编译了,所以重点排查bus子模块
3. 准备maven debug
3.1首先去maven官网下载相同版本的maven源代码(比如我的项目用的maven-3.6.3),使用idea将解压后的maven源代码导入
3.2新建一个使用idea新建一个RemoteDebug启动配置(java远程调试,我用的idea2023.2社区版,使用的New UI)
4. 打开报错的项目,使用命令行进行maven 调试模式编译
4.1底部打开命令行(也可以自己打开项目代码根据目录,直接cmd,需要使用本地maven,如果你的项目使用idea自带的maven可能无法执行下列操作)
4.2然后直接执行命令
mvnDebug -s D:\ProgramFiles\maven\conf\settings_aliyun.xml compile -X
说明:mvnDebug是mvn的调试启动命令,看启动脚本可以发现其实就是开启了一个远程调试端口
-s 是指定maven的配置文件
-X 是打印debug日志
5.启动maven Debug
切换到maven源码项目,启动第3步新建的debug配置,这时候会发现debug跑了一下很快结束了,因为你没有打断点
5.1 但是入口都没找到在哪,怎么打断点呢,直接看maven编译时的错误日志,根据错误堆栈信息,往上追溯maven源代码的包名
5.2 在maven源代码项目中直接找到这个包中报错的那个类并在相应方法下下断点就可以让maven调试时进入断点
5.3 重复第4,5步操作,最终定位到出错文件
(E:\MavenRepository\org\springframework\boot\spring-boot-starter-amqp\2.2.13.RELEASE\_remote.repositories)
使用记事本(我用的notepad--)打开发现文件末尾出现了大量的不可见字符,删除这些多余的字符,根据其他目录中的文件样式,保留末尾一个空行。