eftshift0
eftshift0

Reputation: 30212

gradle: change default port from 5005

I want to debug some JVM instances that are running at the same time. I know that I can run gradle using --debug-jvm so that the JVM will wait until I start the IDE debugger so that it connects to the JVM but it uses port 5005 by default. That's fine for debugging one instance of JVM... but if I want to debug more than one instance, I'll need to define a different port from 5005. How can I achieve this with gradle?

Upvotes: 8

Views: 8292

Answers (4)

Green Ant
Green Ant

Reputation: 1

Option 2 - Use Gradle's debugOptions object

For Grails5 in build.gradle i put debugOptions into bootRun section:

bootRun {
  ...
  jvmArgs(
    // whatever extras you need...
  )
  debugOptions {
    //enabled = true
    port = 5566
    server = true
    suspend = false
  }
  ...
}

Then run grails with or without --debug-jvm switch at the end of arguments list to turn it on/off.

You may also uncomment "enabled=true" to always run in debug mode without passing --debug-jvm.

Upvotes: 0

thehale
thehale

Reputation: 1756

Option 1 - Directly pass the JVM arguments that start up the debugger

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"]  
}

If it doesn't work right away, try stopping all existing Daemons with gradle --stop so Gradle isn't influenced by any past settings when building/running your project.

Option 2 - Use Gradle's debugOptions object

Alternatively, according to Gradle's documentation, the following should also do the trick; however, it didn't work for me. I'm including it for completeness and in the hope that it works in the future.

task runApp(type: JavaExec) {
    ...

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

References:

Upvotes: 0

Lucas Basquerotto
Lucas Basquerotto

Reputation: 8063

In my case I wanted to debug a specific file, so I included the following code in 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()
}

and I can run with:

gradle execFile -PmainClass=com.MyClass -Dmyprop=somevalue -Ddebug=true

The custom execFile task receives:

  • -PmainClass=com.MyClass: the class with the main method I want to execute (in the script, main = mainClass)
  • -Dmyprop=somevalue: a property whose value be retrieved in the application calling System.getProperty("myprop") (in the script, systemProperties System.getProperties() was needed for that)
  • -Ddebug=true: a flag to enable debugging on port 8787 (in the script, see the if condition, and also address=8787, but the port could be changed, and this flag name also could be changed). Using suspend=y the execution is suspended until the debugger is attached to the port (if you don't want this behaviour, you could use suspend=n)

For your use case, you could try to apply the logic behind the line jvmArgs ... to your specific task (or use tasks.withType(JavaExec) { ... } to apply to all tasks of this type).

Using this solution, don't use the --debug-jvm option because you may receive an error about the property jdwp being defined twice.

Update (2020-08-10)

To make sure that the code runs only when I execute the task execFile explicitly (so as to not run when I just build gradle, for example), I changed the code to:

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()
    }
}

See more at: Run gradle task only when called specifically

Upvotes: 5

Karol Dowbecki
Karol Dowbecki

Reputation: 44952

You could modify GRADLE_OPTS environment variable and add standard Java debugger syntax e.g. to use port 8888:

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

Upvotes: 1

Related Questions