知道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
&middot;··
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

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 知道springboot jar包可运行,debug告诉你怎么运行的

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址