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 - 中文开源技术交流社区