В моем случае я хотел отладить определенный файл, поэтому я включил следующий код в 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()
}
, и я могу работать с:
gradle execFile -PmainClass=com.MyClass -Dmyprop=somevalue -Ddebug=true
Пользовательская задача execFile
получает:
-PmainClass=com.MyClass
: класс с основным методом, который я хочу выполнить (в сценарии main = mainClass
) -Dmyprop=somevalue
: aсвойство, значение которого можно получить в приложении, вызывающем System.getProperty("myprop")
(в сценарии для этого потребовалось systemProperties System.getProperties()
) -Ddebug=true
: флаг, разрешающий отладку на порту 8787 (см. сценарийif
условие, а также address=8787
, но порт может быть изменен, и это имя флага также может быть изменено).При использовании suspend=y
выполнение приостанавливается до тех пор, пока отладчик не будет подключен к порту (если вам не нужно это поведение, вы можете использовать suspend=n
)
. В вашем случае вы можете попробоватьчтобы применить логику за линией jvmArgs ...
к конкретной задаче (или использовать tasks.withType(JavaExec) { ... }
, чтобы применить ко всем задачам этого типа).
При использовании этого решения не используйте параметр --debug-jvm
, посколькуВы можете получить ошибку о том, что свойство jdwp
определяется дважды.