run intellij debug java debugging maven intellij-idea breakpoints

java - intellij - maven debug eclipse



El depurador de IntelliJ IDEA 13 no se detiene en el punto de interrupciĆ³n en java para el proyecto maven (3)

Tengo un punto de interrupción en una línea donde está el comando System.out.println("test") . Creo que se llega al comando por ejecución porque veo la cadena impresa "prueba". Pero el punto de ruptura es ignorado.

El punto de ruptura es un círculo rojo todo el tiempo, sin una marca o cruz. Creo que esto es un problema cuando IDEA cree que la clase no está cargada, mientras que sí, porque el comando se ejecuta.

Puedo reproducirlo en diversas circunstancias:

  1. Cuando install exec:exec -DforkMode=never debug (con la configuración de maven, install exec:exec -DforkMode=never )

  2. Depuración remota: ejecuto el objetivo principal en modo de depuración en la consola:

    mvnDebug install exec:exec -DforkMode=never

    o

    mvnDebug install exec:exec

    configuración de depuración remota en IDEA:

    • Argumentos para ejecutar JVM remota:
      -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
    • Para JDK 1.4.X:
      -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
    • Transporte: Socket
    • Modo depurador: adjuntar
    • Anfitrión: localhost
    • Puerto: 8000

En ambos casos, el depurador solo imprime "Conectado a la máquina virtual de destino, dirección: ''localhost: 8000'', transporte: ''socket''"

También probé File > Invalidate Caches / Restart y limpiar compilación, pero el punto de interrupción aún se ignora.

Configuración:

Ubuntu 13.10
IntelliJ IDEA Ultimate build 133.944
Apache Maven 3.0.4
Versión de Java: 1.7.0_51, proveedor: Oracle Corporation
Nombre del sistema operativo: "linux", versión: "3.11.0-17-generic", arch: "amd64", familia: "unix"

EDITAR: parte relevante de 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>


El objetivo de ejecución ejecutará su programa en un proceso separado, por lo que es posible que el depurador no se conecte a la JVM correcta. En su lugar, intente usar el objetivo de java , por ejemplo

mvnDebug install exec:java

Esto ejecutará su programa en el mismo proceso y esperamos que llegue a su punto de interrupción.


Mi solución:

Teniendo en cuenta que tienes un programa que depende de las propiedades del sistema:

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); } }

Y lo estás ejecutando con exec:exec :

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

Con algo de "magia inicial" podemos depurar el proceso iniciado por exec:exec Maven.

Maven

Cambie su exec:exec objetivo para habilitar la depuración remota. Estoy usando suspend=y y server=n , pero no dude en configurar el Agente JDWP como desee:

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

Esto no se pasará directamente a la JVM de Maven, sino que se pasará a exec.args que será utilizado por exec: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

Cree una configuración Remote (nuevamente estoy usando una estrategia de escucha . Debe ajustarla de acuerdo con la configuración de su proceso):

Ahora alterne sus puntos de interrupción y depure su configuración remota. Usando la configuración anterior, esperará hasta que comience el proceso:

Finalmente, ejecute la línea exec:exec arriba y depure su aplicación a voluntad:

Básicamente, necesitas dos configuraciones "Ejecutar / Depurar" para que esto funcione:

  1. Una configuración de Maven para exec:exec con las propiedades del sistema y la configuración del agente JDWP:

  2. La configuración remota actúa como un cliente .


Para depurar aplicaciones web en proyectos de maven con Intellij Community Edition, puede agregar un complemento Tomcat o Jetty a su pom WAR de esta manera:

<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>

Es posible si es necesario agregar controladores de base de datos como este:

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

Luego, utilizando estos complementos, la aplicación se puede iniciar en la línea de comandos (desde el directorio pom):

mvnDebug clean install tomcat7:run-war

O para embarcadero:

mvnDebug clean install jetty:run-war

Con la aplicación ejecutándose en modo de depuración desde la línea de comandos (no es necesario que la ejecute desde Intellij), realice una configuración de depuración remota similar a la que publicó y el punto de interrupción debe alcanzarse.

Si usa Intellij Ultimate Edition, esto no es necesario, ya que puede crear una configuración de servidor para Tomcat o cualquier otro servidor e implementar la aplicación de forma totalmente integrada, con la depuración y la implementación en caliente manejadas de manera transparente.

Hay una prueba de 30 días en la que puede evaluar esta función y otras.