转载

知道springboot jar包可运行,debug告诉你怎么运行的

随着微服务的普及应用,springboot作为spring占领行业微服务的拳头,可能你早已熟练使用它去开发业务功能。当然,你可能知道springboot项目打成的jar可以直接运行,可能你也知道它的原理,但你真的知道它的原理吗,没有亲自debug下,可能就不那么肯定了吧。本文就来debug说下,springboot jar开始运行的真正起点:真正的main方法在哪里,怎么运行的

理论

为了方便阐述,理论先摆出

我假定创建一个spring boot 项目:microservice-comb-server,下面的jar都指这个项目的jar

在项目的pom.xml中引入了 spring-boot-maven-plugin ,生成的jar就可以直接运行了。如下配置

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>
复制代码

因为引入了 spring-boot-maven-plugin , package 生成的jar里包含 META-INF/MANIFEST.MF 文件,其内容如下

MacBook-Pro ~/mic$ unzip microservice-comb-server-1.0.0-SNAPSHOT.jar
···
MacBook-Pro ~/mic$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Implementation-Title: microservice-comb-server
Implementation-Version: 1.0.0-SNAPSHOT
Built-By: yaoliang
Implementation-Vendor-Id: com.skyler.cobweb
Spring-Boot-Version: 2.1.0.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.skyler.cobweb.CobwebCombServerApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_151
Implementation-URL: https://projects.spring.io/spring-boot/#/spring-boot-starter-parent/microservice-comb/microservice-comb-server

复制代码

其中 Main-Class: org.springframework.boot.loader.JarLauncher 才是真正的项目运行开始之地,而 Start-Class: com.skyler.cobweb.CobwebCombServerApplication 也就是我们定义的main方法只在 Main-Class 之后运行的。下面就通过debug来说明这个事实。

实操

debug准备阶段

debug这个jar容易,但如果要debug到这个jar的真正运行开始之地: org.springframework.boot.loader.JarLauncher ,就需要特殊的操作了。

首先,在项目中引入 spring-boot-loader 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-loader</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>
复制代码

然后,通过 mvn clean repackage 将项目打jar包:microservice-comb-server-1.0.0-SNAPSHOT.jar

最后,通过 idea 的 JAR Application 配置jar和源码的位置

知道springboot jar包可运行,debug告诉你怎么运行的

debug ing

在代码中打开 JarLauncher MainMethodRunner 并打上断点标记

知道springboot jar包可运行,debug告诉你怎么运行的
知道springboot jar包可运行,debug告诉你怎么运行的

点击之前配置的 Jar Application 的 debug 按钮,如图

知道springboot jar包可运行,debug告诉你怎么运行的

效果

断点首先停在了 JarLauncher.main方法 处, F9 快捷点到下一个断点

知道springboot jar包可运行,debug告诉你怎么运行的

即 MainMethodRunner.run() 处,而 mainClassName 的值正是我们项目中自定义的 main 方法: com.skyler.cobweb.CobwebCombServerApplication ,再 F9 快捷点到下一个断点

知道springboot jar包可运行,debug告诉你怎么运行的

)

现在,断点才到了我们自己的 main 方法

知道springboot jar包可运行,debug告诉你怎么运行的
原文  https://juejin.im/post/5e6a6089e51d45272054cf3d
正文到此结束
Loading...