Search code examples
javaeclipsespring-bootmavenremote-debugging

Maven & Eclipse remote debugging: connection refused


I'm trying to do remote debugging with Maven and Eclipse. On the remote machine, I do mvnDebug spring-boot:run, and on the local machine in Eclipse, I set up a Remote Java Application debug configuration with the appropriate host IP and port and Connection Type as Standard (Socket Attach).

On the remote machine, before attempting to connect with Eclipse, I only see:

Preparing to execute Maven in debug mode
Listening for transport dt_socket at address: 8000

ss -aln shows something listening on port 8000: users:(("java",pid=949917,fd=4)). As soon as I start the debug process in Eclipse on the local machine, the regular Maven output appears on the remote machine:

Apache Maven 3.6.3 (NON-CANONICAL_2019-11-27T20:26:29Z_root)                                                 
Maven home: /opt/maven                                                                                       
Java version: 1.8.0_242, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-8-openjdk/jre                
Default locale: en_US, platform encoding: UTF-8                                                              
OS name: "linux", version: "5.5.8-arch1-1", arch: "amd64", family: "unix"                                    
[INFO] Scanning for projects...
...

so apparently a connection is made. The output from Maven is identical to a regular run. But Eclipse displays Failed to connect to remote VM. Connection refused. with no additional information, and by now nothing is listening on port 8000 on the remote machine anymore.

I don't have any idea how to even debug this, and the config couldn't be simpler.

The contents of the mvnDebug script are:

MAVEN_DEBUG_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000"

echo Preparing to execute Maven in debug mode

env MAVEN_OPTS="$MAVEN_OPTS" MAVEN_DEBUG_OPTS="$MAVEN_DEBUG_OPTS" "`dirname "$0"`/mvn" "$@"

Any suggestions or insight would be appreciated.


Solution

  • Like maven-surefire-plugin with forked test, springboot seems to fork to a new jvm process. Hence, mvnDebug won't help you in that case: to debug your springboot instance from Maven, you must set up appropraite jvmArguments per this link:

      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>2.2.6.RELEASE</version>
        <configuration>
          <jvmArguments>
            -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
          </jvmArguments>
        </configuration>
        ...
      </plugin>
    

    While I can not explain why you can't connect using remote debug, my hint is that Spring Boot let maven terminates. I did not test but this would explain why you can't connect with Eclipse.

    Note that mvnDebug is mainly for debugging maven and plugins, rather than your own application.