`

spring boot executable jar/war 原理

    博客分类:
  • SSH
阅读更多

http://blog.csdn.net/hengyunabc/article/details/51050219

 

spring boot executable jar/war

spring boot里其实不仅可以直接以 java -jar demo.jar的方式启动,还可以把jar/war变为一个可以执行的脚本来启动,比如./demo.jar

把这个executable jar/war 链接到/etc/init.d下面,还可以变为linux下的一个service。

只要在spring boot maven plugin里配置:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这样子打包出来的jar/war就是可执行的。更多详细的内容可以参考官方的文档。

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#deployment-install

zip格式里的magic number

生成的jar/war实际上是一个zip格式的文件,这个zip格式文件为什么可以在shell下面直接执行?

研究了下zip文件的格式。zip文件是由entry组成的,而每一个entry开头都有一个4个字节的magic number:

Local file header signature = 0x04034b50 (read as a little-endian number)

即 PK\003\004
  • 1
  • 2
  • 3

参考:https://en.wikipedia.org/wiki/Zip_(file_format)

zip处理软件是读取到magic number才开始处理。所以在linux/unix下面,可以把一个bash文件直接写在一个zip文件的开头,这样子会被认为是一个bash script。 而zip处理软件在读取这个文件时,仍然可以正确地处理。

比如spring boot生成的executable jar/war,的开头是:

#!/bin/bash
#
#    .   ____          _            __ _ _
#   /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
#  ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
#   \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
#    '  |____| .__|_| |_|_| |_\__, | / / / /
#   =========|_|==============|___/=/_/_/_/
#   :: Spring Boot Startup Script ::
#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在script内容结尾,可以看到zip entry的magic number:

exit 0
PK^C^D
  • 1
  • 2

spring boot的launch.script

实际上spring boot maven plugin是把下面这个script打包到fat jar的最前面部分。

https://github.com/spring-projects/spring-boot/blob/1ca9cdabf71f3f972a9c1fdbfe9a9f5fda561287/spring-boot-tools/spring-boot-loader-tools/src/main/resources/org/springframework/boot/loader/tools/launch.script

这个launch.script 支持很多变量设置。还可以自动识别是处于auto还是service不同mode中。

所谓的auto mode就是指直接运行jar/war:

./demo.jar
  • 1

service mode则是由操作系统在启动service的情况:

service demo start/stop/restart/status
  • 1

所以fat jar可以直接在普通的命令行里执行,./xxx.jar 或者link到/etc/init.d/下,变为一个service。

分享到:
评论

相关推荐

    SpringBoot 配置构建war部署到tomcat运行

    Spring Boot能够帮助开发者快速构建独立运行的应用程序,通常默认是以jar包的形式运行。然而,在某些场景下,比如需要部署到传统的Web服务器如Apache Tomcat时,我们可能需要将Spring Boot应用打包成war格式。本篇...

    深入Spring Boot实现对Fat Jar jsp的支持

    尽管Spring Boot在创建Web应用程序时提供了诸多便利,但它对内嵌的Servlet容器的支持主要集中在生成WAR文件方面,而不是传统的Fat Jar(也称为executable JAR或uber JAR)。一个Fat Jar通常包含了应用程序的所有依赖...

    spring-boot-reference.pdf

    11.5. Creating an Executable Jar 12. What to Read Next III. Using Spring Boot 13. Build Systems 13.1. Dependency Management 13.2. Maven 13.2.1. Inheriting the Starter Parent 13.2.2. Using Spring Boot ...

    CVE-2022-22963 复现Demo

    If the application is deployed as a Spring Boot executable jar, i.e. the default, it is not vulnerable to the exploit. However, the nature of the vulnerability is more general, and there may be other...

    Spring Boot使用Allatori代码混淆的方法

    Spring Boot 使用 Allatori 代码混淆的方法 在日常开发中,我们经常需要保护我们的代码免受他人的非法访问和盗用,而代码混淆技术正是解决这个问题的有效方法之一。Allatori 是一款功能强大且易于使用的 Java 混淆...

    SpringBoot java-jar命令行启动原理解析

    关于 executable jar,Spring Boot 官方文档中是这样解释的:Executable jars (sometimes called “fat jars”) are archives containing your compiled classes along with all of the jar dependencies that your ...

    使用maven将Java程序打包成exe文件并制作成Windows系统服务之springboot打包(一)项目代码

    要将Spring Boot应用打包成exe文件,我们需要使用两个Maven插件:一个是`spring-boot-maven-plugin`,用于构建可执行的JAR或WAR文件;另一个是`exec-maven-plugin`,它可以将JAR转换为可执行的Windows批处理文件。 ...

    Windows服务注册工具-WinSW

    Spring Boot应用通常设计为可执行的JAR或WAR文件,但默认情况下并不作为Windows服务运行。通过WinSW,我们可以将Spring Boot应用注册为Windows服务,确保其在系统启动时自动启动,且能被系统服务管理机制监控。 **...

    springboot在服务器上的几种启动方式(小结)

    Spring Boot 提供了一个 Maven 插件,可以将应用程序打包成一个可执行的 JAR 文件,然后使用该插件来启动应用程序。首先,需要在项目的 POM 文件中添加以下插件: ```xml &lt;groupId&gt;org.springframework.boot...

    为什么SpringBoot的jar可以直接运行

    SpringBoot的jar可以直接运行是因为它引入了一种创新的打包机制,称为"可执行jar"(executable jar)。这种机制使得SpringBoot应用可以像普通的Java应用程序那样,通过`java -jar`命令直接启动,而无需传统的`java -...

    Java源码打包分发源码 打包免签分发平台+搭建说明

    这可能需要掌握Spring Boot、Servlet、Tomcat等服务器框架和容器技术。开发者需要创建RESTful API接口,处理客户端的请求,比如上传源码、构建APK、存储和下载分发包等。此外,平台的安全性也非常重要,包括数据加密...

Global site tag (gtag.js) - Google Analytics