java远程debug调试

idea启动java项目,debug调试远程项目代码操作步骤:

1、将项目打成jar包,上传服务器,使用命令启动jar

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 MyApp

启动命令解析: 这个命令使用的是主类名启动,而非 -jar myApp.jar的方式。

1.1、解析启动命令含义

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 是一个用于启动 Java 程序并开启远程调试功能的命令。下面为你详细解释该命令中各个部分的含义:

1.2、整体命令结构

  • java:这是 Java 虚拟机(JVM)的启动命令,用于执行 Java 程序。
  • -agentlib:jdwp:这是一个 JVM 选项,用于加载 Java 调试线协议(Java Debug Wire Protocol,JDWP)代理库。JDWP 是一种允许调试器与被调试的 Java 虚拟机进行通信的协议,借助这个选项就能让 JVM 支持远程调试。

1.3、JDWP 选项参数

  • transport=dt_socket:指定了调试器与 JVM 之间的通信传输方式。dt_socket 表示使用套接字(socket)进行通信,也就是通过网络来传输调试信息,这是最常用的传输方式。
  • server=y:表明当前 JVM 会作为调试服务器。意味着它会监听一个指定的端口,等待外部调试器(如 IDE 中的调试工具)来连接。
  • suspend=nsuspend 参数用于控制 JVM 在启动时是否暂停执行。n 代表 no,即 JVM 启动后不会暂停,会正常执行 Java 程序,调试器可以在程序运行过程中随时连接进行调试。若设置为 suspend=y,JVM 启动后会暂停,直到调试器连接成功才会继续执行。
  • address=8889:指定了 JVM 监听的端口号。这里 JVM 会在 8889 端口上等待调试器的连接。在启动调试器时,需要配置相同的端口号,以确保调试器能够与 JVM 建立连接。

1.4、示例场景

假设你有一个名为 MyApp 的 Java 程序,完整的启动命令可能如下:

bash 复制代码
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 MyApp

此命令会启动 MyApp 程序,并开启远程调试功能,允许外部调试器通过 8889 端口连接到该 JVM 进行调试。

2、idea设置远程调试

idea打开java项目后,设置remote jvm debug,选择项目模块,host地址是jar包部署到服务器的地址,port是使用java命令启用的等待调试器链接的端口。

3、执行debug

点击debug启动项目,在浏览器上输入:http://10.1.2.133:8889/user/findAll 在idea中findAll方法中打上断点,访问这个url后,断点就会收到调用,就可以debug调试项目了。

2、java命令启动项目,使用-jar myApp.jar与主类名启动myApp的区别:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 MyApp
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 -jar myApp.jar

解析: 服务器启动java项目,可以启动jar包或者寻找主类名启动。

这个命令不一定非要使用 -jar xxx.jar 来指定启动的 JAR 包。是否使用 -jar 选项取决于你启动 Java 程序的方式。下面为你详细分析不同情况:

情况一:使用主类名启动

如果你像给出的命令 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 MyApp 这样,直接指定主类名(MyApp)来启动 Java 程序,那么就不需要 -jar 选项。这种方式要求主类 MyApp 必须位于类路径(classpath)下,JVM 会在类路径中找到这个类并执行其 main 方法。

情况二:使用 JAR 包启动

当你想通过 JAR 包来启动 Java 程序时,就需要使用 -jar 选项。此时,你需要把 MyApp 替换为具体的 JAR 包名称,例如:

bash 复制代码
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 -jar myapp.jar

在这个命令里,-jar myapp.jar 告知 JVM 从 myapp.jar 这个 JAR 包中寻找主类并执行。要注意的是,这个 JAR 包必须是可执行的,也就是在其 MANIFEST.MF 文件中指定了主类。

总结

是否使用 -jar 选项要依据你的启动需求来定:

  • 若主类在类路径中,可直接指定主类名启动,无需 -jar 选项。
  • 若要从 JAR 包启动程序,则需使用 -jar 选项指定 JAR 包名称。
相关推荐
鬼火儿7 小时前
SpringBoot】Spring Boot 项目的打包配置
java·后端
cr7xin7 小时前
缓存三大问题及解决方案
redis·后端·缓存
间彧8 小时前
Kubernetes的Pod与Docker Compose中的服务在概念上有何异同?
后端
间彧8 小时前
从开发到生产,如何将Docker Compose项目平滑迁移到Kubernetes?
后端
间彧8 小时前
如何结合CI/CD流水线自动选择正确的Docker Compose配置?
后端
间彧8 小时前
在多环境(开发、测试、生产)下,如何管理不同的Docker Compose配置?
后端
间彧8 小时前
如何为Docker Compose中的服务配置健康检查,确保服务真正可用?
后端
间彧8 小时前
Docker Compose和Kubernetes在编排服务时有哪些核心区别?
后端
间彧8 小时前
如何在实际项目中集成Arthas Tunnel Server实现Kubernetes集群的远程诊断?
后端
brzhang9 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构