转载

知道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-pluginpackage 生成的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

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

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

debug ing

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

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

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

知道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...