【问题标题】:IntelliJ IDEA 13 debugger don't stop on breakpoint in java for maven projectIntelliJ IDEA 13 调试器不会在 Maven 项目的 java 断点处停止
【发布时间】:2014-03-06 15:39:06
【问题描述】:

我在System.out.println("test") 命令所在的行上有一个断点。 我相信该命令是通过执行到达的,因为我看到了打印的字符串“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',传输:'socket'”

我也试过File > Invalidate Caches / Restart 和干净的构建,但断点仍然被忽略。

配置:

Ubuntu 13.10
IntelliJ IDEA Ultimate 版本 133.944
Apache Maven 3.0.4
Java 版本:1.7.0_51,供应商:甲骨文公司
操作系统名称:“linux”,版本:“3.11.0-17-generic”,arch:“amd64”,家族:“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>

【问题讨论】:

  • 这可能是您在“目标”中的类在编译时没有调试信息。您是使用 IntelliJ 还是使用 maven 构建应用程序?我会删除目标目录,然后尝试使用 IntelliJ 中的调试按钮进行调试。您的 pom.xml 中是否还有一些特殊的构建步骤? AspectJ 还是类似的?
  • 我们使用 maven 进行构建。当我删除目标目录并按下“调试”时,我注意到 maven-compiler-plugin 将类编译成target/。但仍然是断点被忽略。 pom.xml 中的构建步骤在这里:pastebin.com/zSHh5kTf
  • 我在您的 pom 中没有看到任何可能干扰的内容。这是一个什么样的应用程序?一个网络应用程序?具有主要方法的独立应用程序?当您提到(使用 maven 配置安装 exec:exec -DforkMode=never)时,您在哪里设置?
  • 它基本上是一个服务器应用程序,它在端口上侦听 xml 请求——此时断点被忽略。另一方面,当我运行单元测试时,断点正常工作。 maven配置是在IDE中设置的maven目标(右上角下拉菜单-“编辑配置”)

标签: java debugging maven intellij-idea breakpoints


【解决方案1】:

2021 年更新:

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

较新版本的 IntelliJ IDEA(使用 2020.3 测试)现在可以自动检测 maven exec 配置并添加适当的选项以启用调试。请参阅IDEA-189973 了解更多信息。感谢 @Gili 于 2018 年返回 opening a ticket for this functionality

尽管如此,我在下面的原始答案仍然对旧版本的 IntelliJ、远程调试或在使用 Fork 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"

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

Maven

更改您的 exec:exec 目标以启用远程调试。我正在使用suspend=yserver=n,但请随意配置JDWP Agent

-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

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

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

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


所以基本上你需要两个“运行/调试”配置才能工作:

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

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

【讨论】:

  • 实际上,这个两步解决方案奏效了。虽然,我们已经将 VM 参数存储在 pom.xml 中,所以添加该参数 &lt;argument&gt;-agentlib:jdwp=transport=dt_socket,address=localhost:8000,server=y,suspend=n&lt;/argument&gt; 就足够了。
  • 我想知道 IDEA 是否计划支持调试 maven 项目(在 Eclipse/Netbeans 中它只是在您按下 Debug 按钮时才起作用)
  • Mirelon,IDEA 确实支持开箱即用地调试 Maven 项目。通常您只需要单击调试按钮 (Shift+F9)。这里的问题是您对exec:exec 的调用会产生不同的进程。此设置需要远程调试even on Eclipse and Netbeans
  • 我刚刚使用 Eclipse Kepler(自定义 maven Debug Configurationexec:exec)和 Netbeans 7.4(使用 exec:exec 的自定义 Maven 操作,带或不带 jpda.listen=maven)测试了此设置。直接运行时都跳过了断点。 Netbeans 要求我使用 Attach Debugger...,而 Eclipse 要求我启动单独的 Remote Java Application 调试配置。
  • IDEA 仍然不支持它(截至 2018.1)。我提交了此 RFE:youtrack.jetbrains.com/issue/IDEA-189973
【解决方案2】:

exec 目标将在单独的进程中执行您的程序,因此调试器可能未连接到正确的 JVM。而是尝试使用java 目标,例如:

mvnDebug install exec:java 

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

【讨论】:

  • 在运行/调试配置中只有以下类别:1. Maven,2. 远程,3. TestNG,4. Tomcat 服务器,5. 默认值。我们目前拥有第一类中的所有已定义配置(我也尝试了 Remote)。你的意思是我们应该在哪里添加 java 目标?
  • 在 Maven 运行/调试配置中,您可以将要执行的 Maven 目标放在Parameters 标签下的Command Line 文本框中。
  • 我明白了。我需要添加已在 pom.xml 中指定的其他参数。我编辑了问题并添加了相关部分。我应该如何修改 pom.xml?现在出现“无法解析 mojo org.codehaus.mojo:exec-maven-plugin:1.2.1:java 的配置:无法将配置值分配给 java.lang.String 类型的数组:[-Ddante.server.configuration= /usr/local/etc, -classpath, Classpath {}, com.digmia.dante.server.impl.Server]"
  • 我原以为如果您在 IntelliJ 中运行 exec:execexec:java,IntelliJ 应该使用您的 pom.xml 中的插件配置。
  • 是的,没错。但是当我运行exec:java 时,它无法正确解析。
【解决方案3】:

要使用 Intellij Community Edition 在 maven 项目中调试 Web 应用程序,您可以像这样将 tomcat 或 jetty 插件添加到您的 WAR pom 中:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <configuration>
                <port>8080</port>
                <path>/yourapp</path>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
        </plugin>
    </plugins>
</build>

如果需要,可以像这样添加数据库驱动程序:

<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <dependencies>
        <dependency>
           ... your database driver groupId and artifactId ...
        </dependency>
    </dependencies>
</plugin>

然后使用这些插件可以在命令行中启动应用程序(从 pom 目录):

mvnDebug clean install tomcat7:run-war

或者码头:

mvnDebug clean install jetty:run-war

从命令行以调试模式运行应用程序(您不需要从 Intellij 运行它),执行与您发布的内容类似的远程调试配置,并且应该命中断点。

如果您使用 Intellij Ultimate Edition,那么这不是必需的,因为您可以为 Tomcat 或任何其他服务器创建服务器配置,并以完全集成的方式部署应用程序,透明地处理调试和热部署。

有一个30 day trial,您可以在其中评估此功能和其他功能。

【讨论】:

  • 这不是当前问题,应用程序本身就是服务器。但是我们也有一个在 Tomcat7 上运行的客户端应用程序,所以最终调试它会成为一个问题。那我试试这个解决方案。
  • 确实有效(一键调试)——我们所要做的就是将目标从tomcat7:redeploy修改为tomcat7:run-war并关闭系统tomcat服务器。并修改pom.xml中的webappDirectory
猜你喜欢
  • 2018-11-21
  • 2015-07-17
  • 2017-08-11
  • 2017-09-04
  • 1970-01-01
  • 2023-03-12
  • 2014-10-29
  • 1970-01-01
  • 2015-06-30
相关资源
最近更新 更多