构建工具

摘要:IDEA 集成开发环境、Linux 开发工具、Git 版本控制、项目管理/构建工具等。


目录

[TOC]

项目管理/构建工具

jar 包

Spring Boot 提供了 Maven 插件 spring-boot-maven-plugin,可以方便的将 Spring Boot 项目打成 jar 包或者 war 包。

考虑到部署的便利性,绝大多数场景下,会选择打成 jar 包。这样,就无需在部署项目的服务器上,配置相应的 Tomcat、Jetty 等 Servlet 容器。

Spring Boot jar 包的运行原理jar 包是如何运行,并启动 Spring Boot 项目的呢?

jar 包的结构

共分成四部分:

  1. org 目录:为 Spring Boot 提供的 spring-boot-loader 项目,很大的一个作用,就是解决 jar 包里嵌套 jar 的情况,如何加载到其中的类。
    • java -jar 启动 Spring Boot 项目的秘密所在,也是稍后将深入了解的部分。
  2. META-INF 目录:通过 MANIFEST.MF 文件提供 jar 包的元数据,声明了 jar 的启动类。
  3. BOOT-INF/lib 目录:Spring Boot 项目中引入的依赖jar 包们。
  4. BOOT-INF/classes 目录:Spring Boot 项目中 Java 类所编译的 .class、配置文件等。

Spring Boot  包

运行原理

先简单剧透下,spring-boot-loader 项目需要解决两个问题:

  • 第一,如何引导执行我们创建的 Spring Boot 应用的启动类,例如上述图中的 Application 类。
  • 第二,如何加载 BOOT-INF/class 目录下的,以及 BOOT-INF/lib 目录下内嵌的 jar 包中的类。

Spring Boot jar 启动的原理是非常清晰的,整体如下图所示:

Spring Boot  启动原理

通过 Launcher 来完成引导和启动,通过 MANIFEST.MF 进行具体配置。具体为:

红色部分,解决 jar 包中的类加载问题:

  1. 创建 Archive,实现 jar 包的遍历,将 META-INF/classes 目录和 META-INF/lib 的每一个内嵌的 jar 解析成一个 Archive 对象。
  2. 设置 Handler,处理 jar: 协议的 URL 的资源读取,也就是读取了每个 Archive 里的内容。
  3. 通过 LaunchedURLClassLoader,实现 META-INF/classes 目录下的类及其内嵌的 jar 包中的类的加载。具体的 URL 来源,是通过 Archive 提供;具体 URL 的读取,是通过 Handler 提供。

橘色部分,解决 Spring Boot 应用的启动问题:

Maven

标准化的 Java 项目管理和构建工具。

Maven 的核心功能包括:

  • 项目构建(编译、测试、打包、部署);
  • 依赖管理(自动下载和管理第三方库);
  • 标准化项目结构(约定优于配置);
  • 插件扩展(支持自定义构建流程)。
依赖管理

pom.xml项目描述文件:

  • <dependency> 声明一个依赖后,Maven就会(从中央仓库、镜像仓库下载)自动下载依赖 jar 包及其父依赖、并缓存在本地(放到 classpath 中)。

  • 插件:<plugins><plugin>

项目结构 / 标准目录结构

执行后生成的项目结构:

1
2
3
4
5
6
7
8
9
my-first-app/
├── pom.xml           # Maven 项目配置文件
├── src/
│   ├── main/         # 主代码目录
│   │   └── java/     # Java 源代码
│   │       └── com/example/App.java  # 自动生成的示例类
│   └── test/        # 测试代码目录
│       └── java/     # 测试类
│           └── com/example/AppTest.java  # 自动生成的测试类
构建流程

标准化的构建流程,可自动化实现编译,打包,发布等。

常用命令:

  • mvn clean:清理所有生成的class和jar;
  • mvn clean compile:先清理,再执行到compile
  • mvn clean test:先清理,再执行test,因为执行test前必须执行compile,故不必指定compile
  • mvn clean package:先清理,再执行package
模块管理

抽取共用的pom.xml并继承,用<modules>编译多个模块。

快照

maven中的仓库分为两种:

  • SNAPSHOT 快照仓库用于保存开发过程中的不稳定版本,snapshot一般是开发过程中的迭代版本,snapshot更新后,引用的项目可以不修改版本号自动下载构建。
  • release 正式仓库则是用来保存稳定的发行版本。release版本不允许修改,每次进行release版本修改,发布必须提升版本号。

Gradle

下载完 Gradle 工具之后,IDEA 就会使用它自动下载相关的依赖库。

基于 JVM 的富有突破性构建工具。

  • 特点:基于 Groovy/Kotlin DSL,构建脚本更灵活,性能更好;

  • 适用场景:Android、Kotlin 项目,需要自定义构建流程

Docker 容器

Docker 应用容器引擎:是一个虚拟环境容器,可将开发环境、代码、配置文件等一并打包进去,并发布和应用到任意平台中。

  • 一个轻量级、可移植、自给自足的软件环境,用于运行应用程序
  • Docker 容器将应用程序及其所有依赖项(包括库、配置文件、系统工具等)封装在一个标准化的包中,使得应用能够在任何地方一致地运行。
  • 容器是操作系统级别的虚拟化,不需要运行完整的操作系统,启动和运行更为高效。
  • Docker 是一个开源的应用容器引擎,让开发者可以打包应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows机器上。
  • 使用Docker可以更方便的打包、测试以及部署应用程序。

主要用途:

  • 提供一次性的环境。如,本地测试他人的软件、持续集成时提供单元测试和构建的环境。
  • 提供弹性的云服务。因为 Docker 容器可随开随关,很适合动态扩容和缩容。
  • 组建微服务架构。通过多个容器,一台机器可跑多个服务,在本机就可模拟出微服务架构。

Docker 镜像:国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。

Docker容器和传统VM技术,在技术实现上有所不同。逻辑组成:

  • VM 虚拟机:使用Hypervisor提供虚拟机的运行平台,管理每个VM中操作系统的运行。每个VM都要有自己的操作系统、应用程序和必要的依赖文件等。
  • Docker 容器:使用Docker引擎进行调度和隔离,提高了资源利用率,在相同硬件能力下可以运行更多的容器实例;每个容器拥有自己的隔离化用户空间。

容器编排技术:

  • Kubernetes
  • Swarm
0%