Spring Boot Executable jar/war 原理

  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>
  
  这样子打包出来的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
  
  参考:https://en.wikipedia.org/wiki/Zip_(file_www.thd540.com format)
  
  zip处理软件是读取到magic number才开始处理。所以在linux/unix下面,可以把一个bash文件直接写在一个zip文件的开头,这样子会被认为是一个bash script。 而zip处理软件在读取这个文件时,仍然可以正确地处理。
  
  比如spring boot生成的executable www.michenggw.com jar/war,的开头是:
  
  #!/bin/bash
  
  #
  
  # . ____ _ __ _ _
  
  # /\\ / ___‘_ __ _ _(_)_ __ __ _ \ \ \ \
  
  # ( ( )\___ | ‘_ | ‘_| | ‘_ \/ _` | \ \ \ \
  
  # \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  
  # ‘ |____| .__|_| |_|_| |_\__, | / / / /
  
  # =========|_|==============|___/=/_/_/_/
  
  # :: Spring Boot Startup Script ::
  
  #
  
  在script内容结尾,可以看到zip entry的magic number:
  
  exit 0
  
  PK^C^D
  
  spring boot的launch.script
  
  实际上spring boot maven plugin是把下面这个script打包到fat jar的最前面部分。
  
  https://github.com/spring-projects/spring-boot/blob/v1.5.18.RELEASE/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
  
  而service mode则是由操作系统在启动service的情况:
  
  service demo start/stop/restart/status
  
  所以fat jar可以直接在普通的命令行里执行,.www.yigouyule2.cn /xxx.jar 或者link到/etc/init.d/下,变为一个service。
  
  总结
  
  jar/war实际就是zip格式
  
  spring-boot-maven-www.furggw.com plugin把启动脚本打到executable jar/war的最前面
  
  脚本的最后一行是exit 0,脚本只执行自己的内容,不会执行到jar/war里的内容
  
  zip文件由多个entry组成,entry的开头有magic number,所以zip处理软件可以跳过前面的脚本,准确找到zip entry

原文地址:https://www.cnblogs.com/qwangxiao/p/10090303.html

时间: 2024-11-05 12:17:03

Spring Boot Executable jar/war 原理的相关文章

Spring boot如何打war包发布到tomcat

前言: 平时在使用java做项目开发时,首先想到利用框架来提升开发效率,和提高可维护性.选择spring可以使用ssm(spring框架,springMVC,mybatis),而且企业中应用也比较广泛,然而还是发现,在框架中有很多配置,而且看起来相当繁琐,并且在这些配置中,大部分都属于默认配置,习惯配置.因此spring boot就此诞生,它的主要目的就是实现"0"配置,此处的"0"不是代表没有配置,而是代表极少的配置.并且spring boot还内置了tomcat

【转】Spring boot 打成jar包问题总结

http://www.cnblogs.com/xingzc/p/5972488.html 1.Unable to find a single main class from the following candidates 1.1.问题描述 maven build时出现以下错误提示日志: [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.3.5.RELEASE:repackage

spring boot项目进行war部署,对于静态资源无法访问的问题

记录下jar和war部署方式随意切换部署的一个解决方案,对于如何修改为自定义的目录,这边未说明. 在spring boot开发时一般是直接application运行的(与jar部署一样),因此使用jar部署的时候可以直接运行,静态资源都可以访问: 如果我们需要进行war方式部署呢,静态资源有可能就方法不到,因为war方式部署的访问方式和jar的不同需要带上项目名称: 例如: jar部署:http://localhost:8080/index.html war部署:http://localhost

spring boot 自动装配的原理

参考: https://blog.csdn.net/Dongguabai/article/details/80865599.如有侵权,请联系本人删除! 入口: import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.se

Spring Boot 以 jar 包方式运行在后台

spring-boot jar 包方式启动: 首先,为了防止和常用的 Tomcat 8080 端口冲突,将 Spring-boot 项目的端口号设置为 9090. 具体方法:在 application.properties 文件里写 server.port=9090. 使用 maven 命令:clean package 打包. 放到服务器上一个合适的位置. 使用 Java -jar spring-boot01-1.0-SNAPSHOT.jar 命令,启动 jar 包. 然后,在浏览器输入 htt

Spring Boot导出jar包发布

一:事由 现在的项目组开发项目使用的是Spring Boot的技术,开发的时候是直接通过一个入口主函数来启动项目的.如果将项目交给客户,怎样才能正确的发布运行呢?百度了一下有关的知识,大概了解到是通过导出jar包,直接运行来实现的.不过从网上查阅的资料,都不太理想,于是自己和另外一个同事就倒腾开了.倒腾了好一会,最终找到了一个比较简单有效的方法来实现,现在分享如下. 二:从Eclipse中导出对应的可运行的jar包(这一步是最为关键的) 1:选中对应的java项目——右键——导出 2:选择导出j

spring boot 打jar包,获取resource路径下的文件

前言:最近在spring boot项目静态类中获取resource路径下文件,在idea中启动都可以获取,但是打包后变成了jar包 就无法获取到.我想到了两种方法,一种是根据http访问静态资源比如 localhost:9080/static/template/xxx.ftl文件.另外一种是根据流获取到文件,然后拷贝到新的文件夹下面.下面说的就是第二种方式的代码 public class DocUtil { //此路径是其他方法进行调用,且只需要加载一次private static String

Spring Boot打jar包,排除lombok等scope=provided的依赖

lombok可以使实体更简洁,主要是会在编译.class文件期间,生成get/set方法,还有hash/equals/toString等. 主要是可以让代码更简洁. @Data//生成get/set/toString/hash/equals等 @Accessors(chain = true)//开启链式调用,即H2user user = new H2user().setId(1).setName("https://www.cnblogs.com/tomcatandjerry/").se

spring boot打包为war包,引入外部jar包

1,在src/main/resource下新建目录jar,将外部jar包放在该目录下 2,在pom.xml中添加依赖 groupId,artifactId,version可随便写 <dependency> <groupId>com.huawei</groupId> <artifactId>gsjdbc4</artifactId> <version>1.0</version> <scope>system</