我有一个在 DigitalOcean 上运行的服务器和一个我想要调试的 JAR 文件。我首先使用
在远程服务器上启动 JARjava -jar Server.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
但在控制台上我没有看到类似“正在端口 5005 上监听...”的输出。
当我在 IntelliJ 中按“调试”时,它会显示
无法打开调试器端口(198.xxx.xxx.xx:5005): java.net.ConnectException“连接被拒绝”
我也尝试过使用
-Xdebug
,但还是不行。
如果我设置
suspend=y
,它应该等到调试器连接为止,但相反,它启动时没有问题。
在调试模式下启动远程 Java 进程的命令看起来是正确的。如果启动服务器 JAR 时没有看到“Listening to Port blah”,则可能意味着调试参数没有被选取。快速检查这一点的另一种方法是在执行服务器 JAR 的计算机上使用
telnet localhost 5005
进行测试。如果该端口未被使用,telnet
将失败。
我建议您尝试以下操作,因为参数的顺序可能很重要(稍后我将为此添加一些官方证据):
java "agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" -jar Server.jar
这个命令对我有用:
export JAVA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005'
默认idea远程对话框建议:
'agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'
更改为:
'agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005'
并发出端口 5005。
这个命令对我有用:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar Server.jar
感谢suifengpiao14,但我将更详细地描述问题。
我检查了多项内容,最后找到了原因:实际上就像一个宁静的服务一样,我们希望可以从运行它的服务器外部进行访问,我们应该将 0.0.0.0 设置为名称服务器,这里我们应该这样做类似的。 我检查了可以远程调试的服务器和不能远程调试的服务器之间的区别。使用 netstat 命令:
对于我满意的服务器:
tcp 0 0 0.0.0.0:5005 0.0.0.0:* LISTEN 8323/java
对于我遇到问题的服务器:
tcp 0 0 127.0.0.1:5005 0.0.0.0:* LISTEN 8323/java
因此,使用以下 jvm 选项应该会有所帮助:
'agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005'
'agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005'
就我而言,这是因为在设置 -> 构建、执行、部署 -> 调试器下,我有一个内置服务器运行在与我出于某种原因尝试附加调试器的同一端口上。
对于像我这样有时忘记读书的人...
Copy and paste the arguments to the command line when JVM is started
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
意思是: 复制此行并转到您的 docker 配置。添加环境变量(修改选项下拉列表)。将其粘贴到那里,并在前面添加
JAVA_OPTS=
。
现在,当您正确完成每一项操作时,您将拥有
Listening for transport dt_socket at address: 5005
Command line argument: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
这就是我解决的问题...
我重现了类似的问题:
Unable to open debugger port (localhost:5005): java.net.ConnectException "Connection refused (Connection refused)"
我在使用
JVM
配置运行带有远程命令行参数的调试器时获得了它:Run/Debug
通过附加 IDE
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
集群以来,
原因是: 一旦 Pod 创建并按预期运行
,我需要继续使用 Kubernetes
命令设置端口转发,并在运行调试器
之前在本地公开来自应用程序的流量。 基于 kubectl 端口转发语法
采用格式
,例如:
kubectl port-forward <resource-type/resource-name> [local_port]:<pod_port>
或更短的形式:
kubectl port-forward <pod-name> -n <namespace> 5005:5005
因此,使用以下命令为
kubectl port-forward <pod-name> 5005:5005
集群配置服务的
entrypoint.sh
文件:Kubernetes
结果,在调试器之前运行
java -Djava.security.egd.=file:/dev/./urandom -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -Xmx400m -jar /service.jar
解决了问题。
port-forward
端口启动后,重新启动 tomcat 并再次尝试连接。 希望有帮助。
firewall-cmd --zone=public --permanent --add-port=8001/tcp