jvm gradle:从5005更改默认端口

s8vozzvw  于 2023-08-05  发布在  其他
关注(0)|答案(4)|浏览(169)

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

bvk5enib

bvk5enib1#

在我的例子中,我想调试一个特定的文件,所以我在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方法所在的类(在脚本中为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()
    }
}


查看更多:Run gradle task only when called specifically

iecba09b

iecba09b2#

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

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888

字符串

m1m5dgzv

m1m5dgzv3#

选项1 -直接传递启动调试器的JVM参数

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在构建/运行项目时不受任何过去设置的影响。

选项2 -使用Gradle的debugOptions对象

或者,根据Gradle的文档,以下内容也应该可以实现:但是it didn't work for me。我把它包括在内是为了完整性,并希望它在未来能工作。

task runApp(type: JavaExec) {
    ...

    debugOptions {
        enabled = true
        port = 5566
        server = true
        suspend = false
    }
 }

8aqjt8rx

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。

相关问题