远程调试:在 OpenJDK 11 端口 8787 处未连接到 Wildfly 14

我正在尝试将调试器连接到在Open JDK 11上运行的Wildfy。

尽管Wildfly说:

Listening for transport dt_socket at address: 8787

My IDE (IntelliJ IDEA CE 2018.1) 声称它没有任何连接:

Unable to open debugger port (localhost:8787): java.io.IOException "handshake failed - connection prematurally closed".

我正在通过以下结果启动Wildfly:standalone.sh --debugJAVA_OPTS

-server
-Xms64m
-Xmx512m
-XX:MetaspaceSize=96M
-XX:MaxMetaspaceSize=256m
-Djava.net.preferIPv4Stack=true
-Djboss.modules.system.pkgs=org.jboss.byteman
-Djava.awt.headless=true
-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED
--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED
--add-exports=jdk.unsupported/sun.reflect=ALL-UNNAMED
--add-modules=java.se

Java 9/10/11 中是否有某些更改?使用完全相同的设置进行远程调试在使用 Oracle JDK 8 时工作正常。

使用telnet我可以确认,该端口确实无法访问。8787

阅读@ehsavoie的评论后更新:在运行Wildfly的服务器上显示:netstat -ln

Proto Recv-Q Send-Q Local Address           Foreign Address         State   
tcp        0      0 127.0.0.1:8787          0.0.0.0:*               LISTEN 

因此,显然使用OpenJDK 11,默认情况下,调试端口现在绑定到localhost。


答案 1

对于 jdk 11,您应该使用

-agentlib:jdwp=transport=dt_socket,address=*:8787,server=y,suspend=n

相反。


答案 2

原因在于根据以下答案在 Java 9 中更改的缺省行为:从 Java 9 开始,除非另有指定,否则 JVM 只接受本地连接。

因此,解决方案相当容易:

虽然在 Java 8 中,使用 Wildfly 开始就足够了,但在 Java 9 中,我需要将其更改为 。--debug--debug *:8787