microservices-book
  • 前言
  • 微服务基础
    • 微服务架构和单体应用架构
    • 微服务架构特征
    • 微服务治理与去中心化
    • 微服务演进式设计与优缺点
    • 微服务宏观把控
  • 面向服务的架构
    • SOA 理论与概念
    • 维基百科微服务
    • 微服务和 SOA 对比
  • Spring Boot
    • Spring Boot 应用起步与配置
    • Spring Boot 应用配置分析
    • Spring Boot 打包文件内容与结构
    • 使用 Gradle 构建 Spring Boot 应用
    • Spring Boot 参数自动装配
    • Jar 文件规范
    • Spring Boot Loader 源码分析
    • 反射扩展
    • JDWP 远程调试
    • 使用 JDWP 调试 Spring Boot Loader 源码
    • @SpringBootApplication
    • @SpringBootConfiguration
    • @Configuration
Powered by GitBook
On this page
  • Gradle 任务
  • bootJar 任务
  • 运行 bootJar 打包的文件
  • bootJar 文件分析
  • 解压缩 jar
  • 解压缩后的目录结构

Was this helpful?

  1. Spring Boot

Spring Boot 打包文件内容与结构

PreviousSpring Boot 应用配置分析Next使用 Gradle 构建 Spring Boot 应用

Last updated 5 years ago

Was this helpful?

Gradle 任务

指令:gradle tasks

会显示出当前工程所有可以使用的 gradle 的 task,并且给每一个 task 一个说明。

有些任务是 gradle 自带的,有些则不是。

bootJar 任务

gradle 提供的一个任务,作用是将 Spring Boot 打包成一个独立的 jar 包。不依赖于任何其他的依赖、容器等,是一个自包含的独立 jar 包。这个 jar 包内包含运行这个工程的一切,也就是说它是一个可执行的 jar 包。

老版本的 gradle 插件命令 :packageJar。

注意:基于 Spring Boot 的应用,打包方式都是使用 bootJar 命令,而不是 jar 命令。jar 命令只是把工程打成一个 jar 包,但 bootJar 命令才是打包成一个可执行 jar 文件。这两种打包方式,打包出来的文件结构的差距也是非常大的。

打包生成目录:/build/libs/microservices-0.0.1-SNAPSHOT.jar。

运行 bootJar 打包的文件

指令:java -jar microservices-0.0.1-SNAPSHOT.jar,和普通的运行 jar 的方式一样。

注意:这种方式其实是 Spring Boot 应用部署的标准方式,先把工程通过 bootJar 命令打包成一个可运行的 jar 文件。然后通过 java -jar 命令来执行这个 jar 文件。

当然 Spring Boot 应用也支持把工程打包成 war 文件,不过要把内嵌 tomcat 相关的 jar 包都删除掉,再部署到外部的 tomcat 容器中。

bootJar 文件分析

通过 bootJar 打包后会生成一个 jar 文件,而 这个 jar 文件本身就是一个压缩文件。

解压缩 jar

java 解压缩 jar

通过 java 自带的 jar 指令解压: jar -xvf microservices-0.0.1-SNAPSHOT.jar

这种方式不好的原因在于,会把解压后的所有文件都直接放在当前目录,而不能把解压后的所有文件放在一个指定的目录内。

unzip 解压缩 jar

通过 mac 自带的 unzip 指令解压:unzip microservices-0.0.1-SNAPSHOT.jar -d ./microservices

解压缩后的目录结构

BOOT-INF

传统应用开发中没有的目录结构,Spring Boot 特有的目录,里面有 2 个子目录。分别是:

classes

当前工程编译好的结果文件(也就是 class 字节码文件和相关配置文件)都在这里,包含 src/main/java 和 src/main/resources 下的所有文件。

lib

当前工程依赖的所有 jar 文件(第三方 jar 包)都在这里,居然有 36 个 jar 文件,而我们在 build.gradle 里只引入了一个 starter 的依赖。

META-INF

只有一个文件:MANIFEST.MF。

通过 jar 命令把一个或者若干个 class 文件打包成 jar 包时通常要指定一个文件作为清单文件。当中描述的是可执行 jar 包的基本信息。

Manifest-Version

清单文件版本。

Start-Class

Spring Boot 特有的属性(com.lichee.microservices.MicroservicesApplication),被 @SpringBootApplication 所修饰且包含 main 方法的启动类。

按照一般的经验来猜想,这个类才应该是 Main-Class 才对,但实际并不是。

Spring-Boot-Classes

就是 BOOT-INFO/classes 下的文件。

Spring-Boot-Lib

BOOT-INF/lib 下的文件。

Spring-Boot-Version

Spring Boot 的版本号。

Main-Class

一个可执行 jar 的入口文件,也就是 main 方法所在的类,jar 包文件执行的入口类。居然是 Spring Boot 提供的类(org.springframework.boot.loader.JarLauncher),而不是我们自己写的。只要我们打包方式是 jar 包方式,那么不管什么应用的 Main-Class 永远都是这个 JarLauncher。

JarLauncher:jar 文件的装载器。

注意:有一个细节,在这个清单文件的最后,也就是在 Main-Class 文件之后,一定要有一个回车换行,Spring Boot 采用的是两个回车换行,可以观察上图。

org

由 Spring Boot 提供的一堆字节码文件,入口类 org.springframework.boot.loader.JarLauncher 就在这里。

QQ截图20190513135651
bootJar-dir
MANIFEST.MF-01
org-JarLauncher