I have a breakpoint on a line where is the System.out.println(\"test\")
command.
I believe that the command is reached by execution because I see the printed string
My solution:
Considering that you have a program that depends on system properties:
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);
}
}
And you are running it with exec:exec
:
mvn exec:exec -Dexec.executable=java "-Dexec.args=-classpath %classpath -Dgreeting=\"Hello\" com.mycompany.app.App"
With some "inception magic" we can debug the process started by Mavenexec:exec
.
Change your exec:exec
goal to enable remote debugging. I'm using suspend=y
and server=n
, but feel free to configure the JDWP Agent as you please:
-agentlib:jdwp=transport=dt_socket,server=n,address=127.0.0.1:8000,suspend=y
This will not be passed directly to the maven JVM, instead it will be passed to exec.args
which will be used by 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"
Create a Remote
configuration (again I'm using a Listen strategy. You should adjust it according to your process settings):
Now toggle your breakpoints and Debug your remote configuration. Using the settings above it will wait until your process starts:
Finally run the exec:exec
line above and debug your application at will:
So basically you need two "Run/Debug" configurations for this to work:
A Maven configuration for exec:exec
with the system properties and JDWP agent configuration:
The remote configuration acting as a client.