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 分钟前
Go多服务项目结构优化:为何每个服务单独设置internal目录?
开发语言·后端·golang
李匠202441 分钟前
C++GO语言微服务之gorm框架操作MySQL
开发语言·c++·后端·golang
源码云商1 小时前
基于Spring Boot + Vue的高校心理教育辅导系统
java·spring boot·后端
黄俊懿2 小时前
【深入理解SpringCloud微服务】手写实现一个微服务分布式事务组件
java·分布式·后端·spring·spring cloud·微服务·架构师
Themberfue3 小时前
RabbitMQ ②-工作模式
开发语言·分布式·后端·rabbitmq
有梦想的攻城狮3 小时前
spring中的@Inject注解详情
java·后端·spring·inject
曼岛_3 小时前
[架构之美]Spring Boot多环境5种方案实现Dev/Test/Prod环境隔离
spring boot·后端·架构
Top`3 小时前
服务预热原理
java·后端·spring
幽络源小助理4 小时前
SpringBoot框架开发网络安全科普系统开发实现
java·spring boot·后端·spring·web安全
酷小洋5 小时前
JavaWeb基础
后端·web