在我的例子中,我想调试一个特定的文件,所以我在中包含了以下代码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()
}
Run Code Online (Sandbox Code Playgroud)
我可以运行:
gradle execFile -PmainClass=com.MyClass -Dmyprop=somevalue -Ddebug=true
Run Code Online (Sandbox Code Playgroud)
自定义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 时不运行),我将代码更改为:
gradle execFile -PmainClass=com.MyClass -Dmyprop=somevalue -Ddebug=true
Run Code Online (Sandbox Code Playgroud)
查看更多信息:仅在专门调用时运行 gradle 任务
您可以修改GRADLE_OPTS
环境变量并添加标准 Java 调试器语法,例如使用端口 8888:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
833 次 |
最近记录: |