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:
Cuando
install exec:exec -DforkMode=never
debug (con la configuración de maven,install exec:exec -DforkMode=never
)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
- Argumentos para ejecutar JVM remota:
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:
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.