1. JPDA 概念说明
JPDA(Java Platform Debugger Architecture) 是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。
JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP),以及 Java 调试接口(JDI)。
JDWP是 Java Debug Wire Protocol 的缩写,它定义了调试器(debugger)和被调试的 Java 虚拟机(target vm)之间的通信协议
2. 使用说明
- springboot在IDEA 和使用java -jar 命令启动 类加载器是不一样的, 在IDEA 上的类加载器是AppClassloader, 而使用java -jar 命令 类加载器是LaunchedURLClassLoader(springboot 自定义的类加载器)
2. 那么如何才能在debug模式下找到这个类加载器呢, 首先将demo-0.0.1-SNAPSHOT.jar 进行解压,解压之后得到的目录接口如下:
进入META-INF目录下查看MANIFEST.MF
图上所示就是springboot启动时执行的main方法入口,这个包在BOOT-INF/lib 中并没有被依赖进来,而是将这个类所在的类的class文件拷贝放入到根目录下(这么做符合jar包的启动规范,系统类加载器可以加载到启动类)
3, 找到该类之后再原项目中依赖这个包,然后重新打包项目
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-loader</artifactId>
</dependency>
4. 重新打包后使用如下命令启动项目
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5050 -jar demo-0.0.1-SNAPSHOT.jar
命令说明:
-agentlib: java的代理命令
使用java 命令 可以进行查看
按照提示输入: java -agentlib:jdwp=help
suspend 启动时是否等待
transport 连接方式(dt_socket, dt_shmem)
address 地址
server 监听debug模式
5. 配置idea
mydebut 可以不写, 选择Attache to remote JVM (追加到远程的jvm 上), 端口需要和使用java -jar 启动时的端口保持一致
6. 设置断点,点击debug 启动idea
7. 此时远程调试的配置已经完成,现在解释为什么类加载器不一样,同步debug 可以看到在springboot java -jar启动时,通过设置当前线程的为springboot自定义的类加载器
以上就是springboot启动原理