就我而言,我想调试特定文件,因此我在中包含了以下代码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
:在应用程序调用中检索其值的属性System.getProperty("myprop")
(在脚本中,systemProperties System.getProperties()
为此需要)
-
-Ddebug=true
:在端口 8787 上启用调试的标志(在脚本中,请参阅if
条件,还有address=8787
,但端口可以更改,并且该标志名称也可以更改)。使用suspend=y
执行被挂起,直到调试器连接到端口(如果您不希望这种行为,您可以使用suspend=n
)
对于您的用例,您可以尝试应用该行背后的逻辑jvmArgs ...
到您的特定任务(或使用tasks.withType(JavaExec) { ... }
适用于该类型的所有任务)。
使用此解决方案时,请勿使用--debug-jvm
选项,因为您可能会收到有关该属性的错误jdwp
被定义两次。
更新(2020-08-10)
确保代码仅在我执行任务时运行execFile
明确地(例如,为了在我刚刚构建 gradle 时不运行),我将代码更改为:
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()
}
}
更多信息请访问:仅在专门调用时运行 gradle 任务