我想调试同时运行的一些JVM示例。我知道我可以使用--debug-jvm运行gradle,这样JVM将等待我启动IDE调试器,以便它连接到JVM,但默认情况下它使用端口5005。这对于调试JVM的一个示例来说是很好的...但是如果我想调试多个示例,我就需要定义一个不同于5005的端口。如何使用Gradle实现这一点?
--debug-jvm
bvk5enib1#
在我的例子中,我想调试一个特定的文件,所以我在build.gradle中包含了以下代码:
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任务接收:
execFile
-PmainClass=com.MyClass
main = mainClass
-Dmyprop=somevalue
System.getProperty("myprop")
systemProperties System.getProperties()
-Ddebug=true
if
address=8787
suspend=y
suspend=n
对于您的用例,您可以尝试将jvmArgs ...行背后的逻辑应用于特定任务(或使用tasks.withType(JavaExec) { ... }应用于此类型的所有任务)。使用此解决方案时,不要使用--debug-jvm选项,因为您可能会收到有关属性jdwp定义两次的错误。
jvmArgs ...
tasks.withType(JavaExec) { ... }
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() } }
型查看更多:Run gradle task only when called specifically
iecba09b2#
您可以修改GRADLE_OPTS环境变量并添加标准Java调试器语法,例如使用端口8888:
GRADLE_OPTS
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888
字符串
m1m5dgzv3#
task exampleProgram(type: JavaExec) { classpath = sourceSets.main.runtimeClasspath description = "Your Description" main = 'Example.java' // <package>.<path>.<to>.<YourMainClass>.java // Change `1805` to whatever port you want. jvmArgs=["-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1805"] }
如果它不能立即工作,请尝试使用gradle --stop停止所有现有守护程序,以便Gradle在构建/运行项目时不受任何过去设置的影响。
gradle --stop
debugOptions
或者,根据Gradle的文档,以下内容也应该可以实现:但是it didn't work for me。我把它包括在内是为了完整性,并希望它在未来能工作。
task runApp(type: JavaExec) { ... debugOptions { enabled = true port = 5566 server = true suspend = false } }
型
8aqjt8rx4#
选项2 -使用Gradle的debugOptions对象
对于build.gradle中的Grails 5,我将debugOptions放入bootRun部分:
bootRun { ... jvmArgs( // whatever extras you need... ) debugOptions { //enabled = true port = 5566 server = true suspend = false } ... }
字符串然后运行grails,在参数列表末尾使用或不使用--debug-jvm开关来打开/关闭它。您也可以取消注解“enabled=true”,以始终在调试模式下运行,而不传递--debug-jvm。
4条答案
按热度按时间bvk5enib1#
在我的例子中,我想调试一个特定的文件,所以我在
build.gradle
中包含了以下代码:字符串
我可以运行:
型
自定义
execFile
任务接收:-PmainClass=com.MyClass
:我想执行的main方法所在的类(在脚本中为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时不会运行),我将代码更改为:型
查看更多:Run gradle task only when called specifically
iecba09b2#
您可以修改
GRADLE_OPTS
环境变量并添加标准Java调试器语法,例如使用端口8888:字符串
m1m5dgzv3#
选项1 -直接传递启动调试器的JVM参数
字符串
如果它不能立即工作,请尝试使用
gradle --stop
停止所有现有守护程序,以便Gradle在构建/运行项目时不受任何过去设置的影响。选项2 -使用Gradle的
debugOptions
对象或者,根据Gradle的文档,以下内容也应该可以实现:但是it didn't work for me。我把它包括在内是为了完整性,并希望它在未来能工作。
型
8aqjt8rx4#
选项2 -使用Gradle的debugOptions对象
对于build.gradle中的Grails 5,我将debugOptions放入bootRun部分:
字符串
然后运行grails,在参数列表末尾使用或不使用--debug-jvm开关来打开/关闭它。
您也可以取消注解“enabled=true”,以始终在调试模式下运行,而不传递--debug-jvm。