IntelliJ IDEA 13调试器不会在java for maven项目的断点处停止

时间:2014-03-06 15:39:07

标签: java debugging maven intellij-idea breakpoints

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

断点始终为红色圆圈,没有勾号或十字。 我认为当IDEA认为该类未加载时,这是一个问题,因为该命令已执行。

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

  1. 当我按下debug(使用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
    • 运输:插座
    • 调试器模式:附加
    • 主持人:localhost
    • 港口:8000
  3. 在这两种情况下,调试器只打印“连接到目标VM,地址:'localhost:8000',传输:'socket'”

    我也试过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
    操作系统名称:“linux”,版本:“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>
    

3 个答案:

答案 0 :(得分:8)

我的解决方案:

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

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"

有一些&#34; inception magic&#34;我们可以调试由Maven exec: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 策略。您应该根据您的流程设置进行调整):

enter image description here

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

enter image description here

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

enter image description here


所以基本上你需要两个&#34;运行/调试&#34;这项工作的配置:

  1. exec:exec的Maven配置,包含系统属性和JDWP代理配置:

    enter image description here

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

答案 1 :(得分:1)

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

mvnDebug install exec:java 

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

答案 2 :(得分:1)

要使用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评估此功能以及其他功能。