3

我已经按照此链接通过 Intellij Idea 调试 maven 测试:http: //www.grygoriy.com/2012/01/how-to-debug-tests-maven-test-via.html

到了第三步开始调试时,它是连接的,但很快就断开了,并且没有在断点处停止。我在 Intellij 有:

连接到目标VM,地址:'localhost:5005',传输:'socket'

与目标 VM 断开连接,地址:'localhost:5005',传输:'socket'

任何想法 ?

4

1 回答 1

2

唯一阻止 Idea 调试 Maven 目标的是fork

默认情况下, surefirespring-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>

但不是很清楚:

  1. 在 CI 的情况下(我希望你使用 CI 工具)你没有阻止分叉,虽然它很慢
  2. 如果您将项目发送给其他人 - 如果某些模块以非默认方式运行,他们将不高兴

因此,如果您想取悦 CI、IDEA、合作开发人员和您自己,您应该提供更智能的方式来调试您的构建。

我的建议:

  1. 默认行为是分叉的,因为构建过程经常是事情,在调试它时 - 是异常

  2. 调试器行为与简单易用的“开启”隔离

我的变种:

<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 的行为仍然存在。

额外的利润在哪里 - 您可以将整个调试行为封装在单个配置文件中。

例如在我的真实项目调试配置文件中:

  1. 在 spring-boot:run 上关闭分叉
  2. 关闭 JaCoCo 覆盖(它需要在万无一失的情况下分叉)
  3. 继续在本地构建 Docker 映像,但阻止推送到注册表
  4. 保留完整的打包过程,但阻止发布到 nexus
  5. 将 SOAP UI 功能测试重定向到特定 URL 以进行本地调试
  6. 将 DBCONFIG 重定向到“始终为空”的基于 docker 的 Postgres
  7. 将 log4j 的日志级别降级为 DEBUG

因此,如果我使用mvn <any> -P debug我确定我的环境和过程确实是调试的

但如果我mvn deploy在 CI 上运行 - 我将获得完整的构建过程。

于 2017-06-04T06:04:26.277 回答