spring boot在linux部署到/etc/init.d/app.jar 实现原理揭秘

spring boot在linux部署到/etc/init.d/app.jar 实现原理揭秘

从spring boot的文档知道,spring boot打包一个可以在systemV,直接执行的jar文件。操作也很简单,只需要在pom.xml中加入

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

通过配置后, 进行打包,生成的jar文件就可以放到 /etc/init.d/ 里面(ln -s 的软引用也可以)。这样配置之后java应用, 就可以和mysql等等的服务一样使用/etc/init.d/app.jar {start|stop|status|restart|force-reload} 进行操作了。

我们来探究一下,它是如何实现的

通过查阅资料systemV目录 /etc/init.d/ 中的文件得知, /etc/init.d/中全部是shell脚本,但是我们的app.jar是一个jar文件,对jar文件的认识它的真实格式是zip压缩文件, 这个jar有什么魔力呢?把app.jar,拖入到jd-gui.exe , 看看它到底长什么样,结果报错说文件是无效的,这明明就是个jar文件, 为什么会这样, 难道是jd-gui.exe的bug ?尝试使用360压缩打开这个app.jar, 成功打开, 看到里面有一些spring boot引导启动的class和自己写的class以及第三方库的class文件,但是它到底怎么实现的原理还没找到

最后我们把jar文件拖入 winhex (一个文件二进制查看器)

我们可以看到,这个文件开头是 #!/bin/bash ,那么它是一个bash脚本文件,继续往下看

看到pk 这是zip格式的开头,到这里明白了, 这个jar文件是一个 bash shell和 jar文件的合体文件, spring boot 打包时候把 /etc/init.d/用到脚本加在了文件前面,这个实现方法确实巧妙。

相关资料

script的源码

文档

https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html#deployment-install


原文地址:spring boot在linux部署到/etc/init.d/app.jar 实现原理揭秘 - 跟猪谈理想的个人空间 - OSCHINA - 中文开源技术交流社区