唯一阻止 Idea 调试 Maven 目标的是fork。
默认情况下, surefire和spring-boot等插件使用分叉。
因此,当您从 IDEA 开始调试 maven 目标时,它会连接到 maven,但是您真正想要调试的进程与 maven 进程不同,因此它没有连接。
为了防止在surefire插件中出现这种行为,您应该阅读这篇文章:http ://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html
简而言之:
如果您使用旧的万能:
<configuration>
<forkMode>never</forkMode>
</configuration>
在新的万无一失中:
<configuration>
<forkCount>0</forkCount>
</configuration>
但不是很清楚:
- 在 CI 的情况下(我希望你使用 CI 工具)你没有阻止分叉,虽然它很慢
- 如果您将项目发送给其他人 - 如果某些模块以非默认方式运行,他们将不高兴
因此,如果您想取悦 CI、IDEA、合作开发人员和您自己,您应该提供更智能的方式来调试您的构建。
我的建议:
默认行为是分叉的,因为构建过程经常是事情,在调试它时 - 是异常
调试器行为与简单易用的“开启”隔离
我的变种:
<properties>
<test.forkCount>1</test.forkCount>
</properties>
<profiles>
<profile>
<id>debug</id>
<properties>
<test.forkCount>0</test.forkCount>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<!-- surefire -->
<configuration>
<forkCount>${test.forkCount}</forkCount>
</configuration>
</plugin>
</plugins>
</build>
因此,在 IDEA 中,您只需要创建带有目标测试的命名运行配置,并将调试包含到配置文件列表中。
但在其他情况下 - 默认情况下,maven 的行为仍然存在。
额外的利润在哪里 - 您可以将整个调试行为封装在单个配置文件中。
例如在我的真实项目调试配置文件中:
- 在 spring-boot:run 上关闭分叉
- 关闭 JaCoCo 覆盖(它需要在万无一失的情况下分叉)
- 继续在本地构建 Docker 映像,但阻止推送到注册表
- 保留完整的打包过程,但阻止发布到 nexus
- 将 SOAP UI 功能测试重定向到特定 URL 以进行本地调试
- 将 DBCONFIG 重定向到“始终为空”的基于 docker 的 Postgres
- 将 log4j 的日志级别降级为 DEBUG
因此,如果我使用mvn <any> -P debug
我确定我的环境和过程确实是调试的
但如果我mvn deploy
在 CI 上运行 - 我将获得完整的构建过程。