I want to debug some JVM instances that are running at the same time. I know that I can run gradle using --debug-jvm
so that the JVM will wait until I start the
You could modify GRADLE_OPTS
environment variable and add standard Java debugger syntax e.g. to use port 8888:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888
In my case I wanted to debug a specific file, so I included the following code in build.gradle
:
task execFile(type: JavaExec) {
main = mainClass
classpath = sourceSets.main.runtimeClasspath
if (System.getProperty('debug', 'false') == 'true') {
jvmArgs "-Xdebug", "-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=y"
}
systemProperties System.getProperties()
}
and I can run with:
gradle execFile -PmainClass=com.MyClass -Dmyprop=somevalue -Ddebug=true
The custom execFile
task receives:
-PmainClass=com.MyClass
: the class with the main method I want to execute (in the script, main = mainClass
)-Dmyprop=somevalue
: a property whose value be retrieved in the application calling System.getProperty("myprop")
(in the script, systemProperties System.getProperties()
was needed for that)-Ddebug=true
: a flag to enable debugging on port 8787 (in the script, see the if
condition, and also address=8787
, but the port could be changed, and this flag name also could be changed). Using suspend=y
the execution is suspended until the debugger is attached to the port (if you don't want this behaviour, you could use suspend=n
)For your use case, you could try to apply the logic behind the line jvmArgs ...
to your specific task (or use tasks.withType(JavaExec) { ... }
to apply to all tasks of this type).
Using this solution, don't use the --debug-jvm
option because you may receive an error about the property jdwp
being defined twice.
Update (2020-08-10)
To make sure that the code runs only when I execute the task execFile
explicitly (so as to not run when I just build gradle, for example), I changed the code to:
task execFile {
dependsOn 'build'
doLast {
tasks.create('execFileJavaExec', JavaExec) {
main = mainClass
classpath = sourceSets.main.runtimeClasspath
if (System.getProperty('debug', 'false') == 'true') {
jvmArgs "-Xdebug", "-agentlib:jdwp=transport=dt_socket,address=*:8787,server=y,suspend=y"
}
systemProperties System.getProperties()
}.exec()
}
}
See more at: Run gradle task only when called specifically