gradle:将默认端口从5005更改为

eft*_*ft0 6 java debugging jvm gradle

我想调试一些同时运行的JVM实例。我知道我可以使用gradle运行,--debug-jvm以便JVM等待直到启动IDE调试器,以便它连接到JVM,但默认情况下使用端口5005。这对于调试JVM的一个实例是很好的……但是,如果我要调试多个实例,则需要定义一个与5005不同的端口。如何使用gradle实现它?

Luc*_*tto 5

在我的例子中,我想调试一个特定的文件,所以我在中包含了以下代码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 任务


Kar*_*cki 2

您可以修改GRADLE_OPTS环境变量并添加标准 Java 调试器语法,例如使用端口 8888:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很有希望...但是调试器无法在我在项目上设置的断点处停止。如果我使用 --debug-jvm 并使用端口 5005 进行连接,它会按预期停止。我想是少了点什么吧 (2认同)