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
Maven
exec:exec.
Maven
Change your
exec:execgoal 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.argswhich 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"
IntelliJ IDEA
Create a
Remoteconfiguration (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:execline 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.



