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 包名称。
相关推荐
KYGALYX1 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了1 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法2 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
Moment2 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
Cobyte3 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
程序员侠客行4 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
Honmaple4 小时前
QMD (Quarto Markdown) 搭建与使用指南
后端
PP东4 小时前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
invicinble4 小时前
springboot的核心实现机制原理
java·spring boot·后端
全栈老石5 小时前
Python 异步生存手册:给被 JS async/await 宠坏的全栈工程师
后端·python