记一个由于 IDEA 更新引发的神奇问题

上周六用 IDEA 直接 run 一个 Spring Boot 工程的 Application Bootstrap 的时候,什么错误也没有就直接退出了(从未成功运行过)

1
Process finished with exit code 1

或者是这样的异常(曾经成功启动过)

1
2
3
java.lang.IllegalStateException: Failed to load property source from location 'classpath:/bootstrap.properties'
...
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'server.profiles.active' in value "${server.profiles.active}"

这个问题的奇葩之处在于同样的代码同样的步骤,在我的 IDE 里不行,在同事的上边就能正常。上周六是百思不得姐,今天终于搞定,故记录一下。

说问题之前我得先说一下项目结构。我们的项目是基于 Spring Cloud 的微服务,每个微服务内部又划分成了不同的模块便于管理。比如 user 服务的简化版结构是这样的

1
2
3
4
5
6
7
8
9
10
11
cloud-user
├── app
│   ├── pom.xml
│   └── src
├── config
│   ├── config
│   ├── pom.xml
│   └── src
├── core
│   └── pom.xml
└── pom.xml

各个 module 都是一个简单 maven 工程,共同组成了 cloud-user 这个 Spring Boot 工程

  • app:controllers 和 Application Bootstrap
  • config:配置相关
  • core:主要业务逻辑

其中在最顶层的 pom 中有如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dependencies>
<dependency>
<groupId>com.windmt.cloud</groupId>
<artifactId>cloud-user-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.windmt.cloud</groupId>
<artifactId>cloud-user-app</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.windmt.cloud</groupId>
<artifactId>cloud-user-config</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
<modules>
<module>app</module>
<module>core</module>
<module>config</module>
</modules>

然后分析问题。

不过最开始这个项目启动的时候是任何异常信息都没有,除了会在项目目录下生成个奇怪的文件夹 logRoot_IS_UNDEFINED,里边是一些空的 log 文件。logRoot 是在 config 里通过 SpEL 定义的。那么就是说配置没有被正确的加载。

我们的配置文件是从配置中心获取的,这时候我开始各种检查网络、检查代理、检查 Maven、检查 IDEA 的配置、重置配置,但是问题依旧。

尝试用 Maven 打包再运行,发现这是 OK 的,说明代码没问题。这时候再在 IDEA 里直接 run Application Bootstrap 也是 OK 的,但是再一执行 mvn clean 就又不行了。

这时候我和同事关于这个工程的差别就仅差 IDEA 版本的差别了,他是老版本 2017.x 而我的是最新的 2018.1.3。他随后也装了一个新版本,发现也出这个问题了,看来还真是因为升级 IDEA 而引入的问题。

在上周六排查这个问题整个大半个下午,也没整出来。今天再打开设置一看,不禁怀疑起自己眼睛——为什么周六就没注意到这个配置呢?

好了,言归正传,这个问题其实很好解决,在 IDEA 的 Maven Settings 里勾选 “Create module groups for multi-module Maven projects” 就好了。注意一点的是,这个配置只对当前 project 有效。

idea maven module groups

如果勾选了上面的配置还不行,就按以下步骤操作一遍

  • mvn clean
  • 从 IDEA 里移除工程
  • 删除工程目录下所有 .idea 目录和 .iml 文件
  • 重新导入工程
  • 在 Preferences | Build, Execution, Deployment | Build Tools | Maven | Importing 勾选 Create module groups for multi-module Maven projects