IntelliJ IDEA 13 调试器不会在 java 中为 maven 项目停止断点马文IntelliJ IDEA

我在命令所在的行上有一个断点。我相信该命令是通过执行到达的,因为我看到打印的字符串“test”。但断点将被忽略。System.out.println("test")

断点始终是一个红色圆圈,没有刻度或叉号。当IDEA认为类未加载时,我认为这是一个问题,因为它是,因为命令被执行了。

我可以在各种情况下重现它:

  1. 当我按调试时(使用 maven 配置)install exec:exec -DforkMode=never)

  2. 远程调试 - 我在控制台的调试模式下运行 maven 目标:

    mvnDebug install exec:exec -DforkMode=never

    mvnDebug install exec:exec

    IDEA 中的远程调试配置:

    • 运行远程 JVM 的参数:
      -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
    • 对于 JDK 1.4.X:
      -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
    • 运输:插座
    • 调试器模式:附加
    • 主机:本地主机
    • 端口:8000

在这两种情况下,调试器仅打印“已连接到目标 VM,地址:'localhost:8000',传输:'套接字'”

我也尝试过清理构建,但断点仍然被忽略。File > Invalidate Caches / Restart

配置:

Ubuntu 13.10
IntelliJ IDEA Ultimate build 133.944
Apache Maven 3.0.4
Java 版本: 1.7.0_51, 供应商: Oracle Corporation
OS name: “linux”, version: “3.11.0-17-generic”, arch: “amd64”, family: “unix”

编辑:pom.xml的相关部分:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.2.1</version>
  <configuration>
    <executable>java</executable>
      <arguments>
        <argument>-D--secret--.server.configuration=/usr/local/etc</argument>
        <argument>-classpath</argument><classpath/>
        <argument>com.--secret--.Server</argument>
      </arguments>
  </configuration>
</plugin>

答案 1

2021年更新:

如今,在大多数情况下,调试应该是开箱即用的。

较新版本的IntelliJ IDEA(使用2020.3测试)现在可以自动检测配置并添加适当的选项以启用调试。有关详细信息,请参阅 IDEA-189973。感谢@Gili在2018年为此功能打开票证maven exec

尽管如此,我的原始答案对于旧版本的IntelliJ,远程调试或使用某些用于VM的Maven / Gradle插件进行调试仍然需要手动传递到下游(相应地调整配置)时,我的原始答案仍然很有用。


我的解决方案:

考虑到您有一个依赖于系统属性的程序:

package com.mycompany.app;


public class App {

    private static final String GREETING = System.getProperty("greeting", "Hi");

    public static void main(String[] args) {
        int x = 10;
        System.out.println(GREETING);
    }
}

并且您正在运行它:exec:exec

mvn exec:exec -Dexec.executable=java "-Dexec.args=-classpath %classpath -Dgreeting=\"Hello\" com.mycompany.app.App"

通过一些“初始魔法”,我们可以调试Maven启动的过程。exec:exec

马文

更改目标以启用远程调试。我正在使用 和 ,但您可以随意配置 JDWP 代理exec:execsuspend=yserver=n

-agentlib:jdwp=transport=dt_socket,server=n,address=127.0.0.1:8000,suspend=y`

不会直接传递给 maven JVM,而是传递给由 以下人员使用:exec.argsexec:exec

mvn exec:exec -Dexec.executable=java "-Dexec.args=-classpath %classpath -agentlib:jdwp=transport=dt_socket,server=n,address=127.0.0.1:8000,suspend=y -Dgreeting=\"Hello\" com.mycompany.app.App"

IntelliJ IDEA

创建一个配置(我再次使用 Listen 策略。您应该相应地调整它):Remote

enter image description here

现在切换断点并调试远程配置。使用上面的设置,它将等到您的进程启动:

enter image description here

最后运行上面的行并随意调试应用程序:exec:exec

enter image description here


因此,基本上您需要两个“运行/调试”配置才能正常工作:

  1. 具有系统属性和 JDWP 代理配置的 Maven 配置:exec:exec

enter image description here

  1. 充当客户端的远程配置。

答案 2

目标将在单独的进程中执行程序,因此调试器可能无法连接到正确的 JVM。相反,请尝试使用目标,例如:execjava

mvnDebug install exec:java 

这将在同一过程中执行您的程序,并希望您将遇到断点。