美文网首页Java架构技术进阶Java面试题总结
知道springboot jar包可运行,debug告诉你怎么运

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

作者: 代码小当家 | 来源:发表于2020-03-13 20:20 被阅读0次

    推荐阅读:

    47天时间,洒热血复习,我成功“挤进”了字节跳动(附Java面试题+学习笔记+算法刷题)​zhuanlan.zhihu.com

    图标 面试字节跳动三轮凉凉,内推4面终拿下抖音offer(Java后台研发)​zhuanlan.zhihu.com 图标

    随着微服务的普及应用,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和源码的位置

    image

    debug ing

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

    image image

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

    image

    效果

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

    image

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

    image

    )

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

    image

    小结

    本文简述了下spring boot 可执行的jar的原理,旨在重点实操部分,鼓励通过自己debug代码的方式,真正切实清晰的感受原理,从抽象的概念转到具体的眼前。

    作者:姚一号
    链接:https://juejin.im/post/5e6a6089e51d45272054cf3d
    来源:掘金

    相关文章

      网友评论

        本文标题:知道springboot jar包可运行,debug告诉你怎么运

        本文链接:https://www.haomeiwen.com/subject/rgdyshtx.html