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

运行原理
先简单剧透下,spring-boot-loader 项目需要解决两个问题:
- 第一,如何引导执行我们创建的 Spring Boot 应用的启动类,例如上述图中的 Application 类。
- 第二,如何加载
BOOT-INF/class目录下的类,以及BOOT-INF/lib目录下内嵌的jar包中的类。
Spring Boot jar 启动的原理是非常清晰的,整体如下图所示:

通过 Launcher 来完成引导和启动,通过 MANIFEST.MF 进行具体配置。具体为:
红色部分,解决 jar 包中的类加载问题:
- 创建 Archive,实现
jar包的遍历,将META-INF/classes目录和META-INF/lib的每一个内嵌的jar解析成一个 Archive 对象。 - 设置 Handler,处理
jar:协议的 URL 的资源读取,也就是读取了每个 Archive 里的内容。 - 通过 LaunchedURLClassLoader,实现
META-INF/classes目录下的类及其内嵌的jar包中的类的加载。具体的 URL 来源,是通过 Archive 提供;具体 URL 的读取,是通过 Handler 提供。
橘色部分,解决 Spring Boot 应用的启动问题:
- 通过 MainMethodRunner ,实现 Spring Boot 应用的启动类的执行。
Maven
标准化的 Java 项目管理和构建工具。
Maven 的核心功能包括:
- 项目构建(编译、测试、打包、部署);
- 依赖管理(自动下载和管理第三方库);
- 标准化项目结构(约定优于配置);
- 插件扩展(支持自定义构建流程)。
依赖管理
pom.xml项目描述文件:
-
用
<dependency>声明一个依赖后,Maven就会(从中央仓库、镜像仓库下载)自动下载依赖 jar 包及其父依赖、并缓存在本地(放到 classpath 中)。 -
插件:
<plugins><plugin>
项目结构 / 标准目录结构
执行后生成的项目结构:
1 | |
构建流程
标准化的构建流程,可自动化实现编译,打包,发布等。
常用命令:
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