这个问题是 2023 年 7 月 26 日遇到的,当时还是 IDEA 2023.1.4,结果文章还没写完,7 月 27 日自动给更新了 IDEA 2023.2。问题估计解决了。
所以,本文就简单提一下 IDEA 自身报错的排查方法。
规避/解决方式
先说问题怎么处理:
IDEA 设置从 Maven wrapper 改为使用内置 Maven。
排查步骤
Maven 项目模块调整后,IDEA 没有正确识别新模块
项目的 Maven 模块有一些调整,fixture 下新增了一个 database 模块。按理说,平时 IDEA 会自动识别新模块并自动移除被删除的模块。但是,新增的 database 模块一直没有被加入源码,被删除的模块仍然在模块列表里。
使用 Maven 命令 install 正常,但 IDEA 构建项目会发生找不到包、类等编译错误。
检查 database 模块的 pom.xml 文件,里面没有发现错误。(不然 Maven install 执行也会出问题)
IDEA 尝试执行 Reload All Maven Projects
执行后问题没有解决,但在 Build 窗口中看到报了一个错误:
这个错误没有任何详细信息。
尝试过清除缓存等手段均无法解决问题。
既然 IDEA 报错了,问题还没解决,要想办法知道具体报的是什么错。
检查 IDEA 日志
找 IDEA 日志的方式有很多,可以在 Help 菜单中直接打开,也可以通过 Actions 窗口导航。
Linux 下可以直接 tail IDEA log,其他平台可能需要手动打开 IDEA 日志文件。
搜索 Build 窗口中抛出的异常 java.lang.reflect.InvocationTargetException
,在日志中发现了完整信息:
2023-07-26 16:31:47,659 [ 59616] INFO - #o.j.i.m.p.MavenProjectsProcessor - [maven import] MavenProjectsProcessorReadingTask took 3303ms
2023-07-26 16:31:47,765 [ 59722] WARN - #o.j.i.maven - java.lang.reflect.InvocationTargetException
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at org.jetbrains.idea.maven.server.MavenRemoteObject.wrapToSerializableRuntimeException(MavenRemoteObject.java:28)
at org.jetbrains.idea.maven.server.Maven3XServerEmbedder.<init>(Maven3XServerEmbedder.java:239)
at org.jetbrains.idea.maven.server.Maven36ServerEmbedderImpl.<init>(Maven36ServerEmbedderImpl.java:8)
at org.jetbrains.idea.maven.server.Maven36ServerImpl.createEmbedder(Maven36ServerImpl.java:22)
# 省略部分链路
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.jetbrains.idea.maven.server.Maven3XServerEmbedder.<init>(Maven3XServerEmbedder.java:229)
# 省略部分链路
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
... 1 more
Caused by: java.io.FileNotFoundException: The specified global settings file does not exist: /home/wuweijie/conf/settings.xml
at org.apache.maven.cli.configuration.SettingsXmlConfigurationProcessor.process(SettingsXmlConfigurationProcessor.java:117)
at org.apache.maven.cli.MavenCli.configure(MavenCli.java:1169)
at org.apache.maven.cli.MavenCli.loadCoreExtensions(MavenCli.java:758)
at org.apache.maven.cli.MavenCli.container(MavenCli.java:633)
... 24 more
发现错误原因可能是 Maven 尝试在路径 /home/wuweijie/conf/settings.xml
读取配置文件,但这个路径 conf
目录并不存在,而且我也从来没有在 .m2
目录以外的地方放置过任何 Maven 配置。
检查 Maven 配置
配置文件没有指定。
虽然勾选了使用 .mvn/maven.confg
,但这个路径文件也不存在。
所以 IDEA 到底是从哪里弄来了一个不存在的路径?
检索 IDEA 的 YouTrack(类似 GitHub Issues)
发现确实有人反馈了同样的问题,已经在 2023.1.5 和 2023.2 解决了。
https://youtrack.jetbrains.com/issue/IDEA-322338/maven-reimport-fails-with-java.io.FileNotFoundException-The-specified-global-settings-file-does-not-exist-conf-settings.xml
小结
其实查 IDEA 本身的问题和平时没有太大的差异:
- 查日志,找出具体原因;
- 查 issues,看是否有同样问题或解决方案;没有类似的问题就提个新的 issue。
- 感兴趣的可以自己深入排查。