13. Build Systems

强烈建议您选择一个支持dependency management并且可以使用发布到“ Maven Central”存储库的工件的构建系统。我们建议您选择 Maven 或 Gradle。可以使 Spring Boot 与其他构建系统(例如,Ant)一起使用,但是它们并没有得到很好的支持。

13.1 依赖性 Management

每个 Spring Boot 版本都提供了它支持的精选依赖列表。实际上,您不需要为构建配置中的所有这些依赖项提供版本,因为 Spring Boot 会为您 Management 版本。当您升级 Spring Boot 本身时,这些依赖项也会以一致的方式升级。

Note

您仍然可以指定版本,并在需要时覆盖 Spring Boot 的建议。

精选列表包含可与 Spring Boot 一起使用的所有 spring 模块以及精炼的第三方库列表。该列表作为标准物料 Lists(Spring 引导相关性)可用,可以与MavenGradle一起使用。

Warning

每个 Spring Boot 版本都与 Spring Framework 的基本版本相关联。我们强烈建议您不要指定其版本。

13.2 Maven

Maven 用户可以从spring-boot-starter-parent项目继承来获取合理的默认值。父项目提供以下功能:

  • Java 1.8 是默认的编译器级别。

  • UTF-8 源编码。

  • 继承自 spring-boot-dependencies pom 的依赖性 Management 部分,用于 Management 常见依赖项的版本。当在您自己的 pom 中使用这些依赖关系时,可以为这些依赖关系省略标记。

  • 带有repackage执行 ID 的repackage goal的执行。

  • Sensible resource filtering.

  • 合理的插件配置(exec pluginGit 提交 IDshade)。

  • application.propertiesapplication.yml的敏感资源过滤,包括特定于配置文件的文件(例如application-dev.propertiesapplication-dev.yml)

请注意,由于application.propertiesapplication.yml文件接受 Spring 样式占位符(${…}),因此 Maven 过滤已更改为使用@[email protected]占位符。 (您可以通过设置名为resource.delimiter的 Maven 属性来覆盖它.)

13.2.1 继承 Starter Parent

要将项目配置为从spring-boot-starter-parent继承,请设置parent,如下所示:

<!-- Inherit defaults from Spring Boot -->
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.1.RELEASE</version>
</parent>

Note

您只需要为此依赖项指定 Spring Boot 版本号。如果导入其他启动器,则可以安全地省略版本号。

使用该设置,您还可以通过覆盖自己项目中的属性来覆盖各个依赖项。例如,要升级到另一个 Spring Data 发布系列,可以将以下内容添加到pom.xml

<properties>
	<spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>

Tip

spring-boot-dependencies pom上查看受支持的属性的列表。

13.2.2 在没有父 POM 的情况下使用 Spring Boot

并非每个人都喜欢从spring-boot-starter-parent POM 继承。您可能需要使用自己的公司标准父级,或者可能希望显式声明所有 Maven 配置。

如果您不想使用spring-boot-starter-parent,仍然可以通过使用scope=import依赖项来保留依赖项 Management(而不是插件 Management)的好处,如下所示:

<dependencyManagement>
		<dependencies>
		<dependency>
			<!-- Import dependency management from Spring Boot -->
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>2.1.1.RELEASE</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

如上所述,前面的示例设置不允许您使用属性来覆盖各个依赖项。为了获得相同的结果,您需要在项目的dependencyManagement 之前spring-boot-dependencies条目之前添加一个条目。例如,要升级到另一个 Spring Data 发布系列,可以将以下元素添加到pom.xml

<dependencyManagement>
	<dependencies>
		<!-- Override Spring Data release train provided by Spring Boot -->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-releasetrain</artifactId>
			<version>Fowler-SR2</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>2.1.1.RELEASE</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

Note

在前面的示例中,我们指定了* BOM *,但是可以以相同方式覆盖任何依赖项类型。

13.2.3 使用 Spring Boot Maven 插件

Spring Boot 包含一个Maven plugin,可以将项目打包为可执行 jar。如果要使用插件,请将其添加到<plugins>部分,如以下示例所示:

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

Note

如果您使用 Spring Boot 启动器的父 pom,则只需添加插件。除非您要更改父级中定义的设置,否则无需对其进行配置。

13.3 Gradle

要了解有关将 Spring Boot 与 Gradle 结合使用的信息,请参阅 Spring Boot 的 Gradle 插件的文档:

13.4 Ant

可以使用 Apache Ant Ivy 构建 Spring Boot 项目。 spring-boot-antlib“ AntLib”模块也可用于帮助 Ant 创建可执行 jar。

要声明依赖关系,典型的ivy.xml文件看起来类似于以下示例:

<ivy-module version="2.0">
	<info organisation="org.springframework.boot" module="spring-boot-sample-ant" />
	<configurations>
		<conf name="compile" description="everything needed to compile this module" />
		<conf name="runtime" extends="compile" description="everything needed to run this module" />
	</configurations>
	<dependencies>
		<dependency org="org.springframework.boot" name="spring-boot-starter"
			rev="${spring-boot.version}" conf="compile" />
	</dependencies>
</ivy-module>

典型的build.xml类似于以下示例:

<project
	xmlns:ivy="antlib:org.apache.ivy.ant"
	xmlns:spring-boot="antlib:org.springframework.boot.ant"
	name="myapp" default="build">

	<property name="spring-boot.version" value="2.1.1.RELEASE" />

	<target name="resolve" description="--> retrieve dependencies with ivy">
		<ivy:retrieve pattern="lib/[conf]/[artifact]-[type]-[revision].[ext]" />
	</target>

	<target name="classpaths" depends="resolve">
		<path id="compile.classpath">
			<fileset dir="lib/compile" includes="*.jar" />
		</path>
	</target>

	<target name="init" depends="classpaths">
		<mkdir dir="build/classes" />
	</target>

	<target name="compile" depends="init" description="compile">
		<javac srcdir="src/main/java" destdir="build/classes" classpathref="compile.classpath" />
	</target>

	<target name="build" depends="compile">
		<spring-boot:exejar destfile="build/myapp.jar" classes="build/classes">
			<spring-boot:lib>
				<fileset dir="lib/runtime" />
			</spring-boot:lib>
		</spring-boot:exejar>
	</target>
</project>

Tip

如果您不想使用spring-boot-antlib模块,请参阅* 第 91.9 节“不使用 spring-boot-antlib 从 Ant 构建可执行存档” *“操作方法”。

13.5 Starters

Starter 程序是一组方便的依赖项 Descriptors,您可以在应用程序中包括它们。您可以一站式购买所需的所有 Spring 和相关技术,而不必遍历示例代码和依赖 Descriptors 的复制粘贴负载。例如,如果要开始使用 Spring 和 JPA 进行数据库访问,请在项目中包括spring-boot-starter-data-jpa依赖项。

Starter 程序包含许多启动项目并快速运行所需的依赖项,并且具有一组受支持的受管传递性依赖项。

What's in a name

所有“官方”Starter 者都遵循类似的命名方式; spring-boot-starter-*,其中*是特定类型的应用程序。这种命名结构旨在在您需要寻找 Starter 者时提供帮助。许多 IDE 中的 Maven 集成使您可以按名称搜索依赖项。例如,在安装了适当的 Eclipse 或 STS 插件的情况下,您可以在 POM 编辑器中按ctrl-space并键入“ spring-boot-starter”以获取完整列表。

如“ 创建自己的 Starter”部分中所述,第三方启动程序不应以spring-boot开头,因为它是为官方 Spring Boot 工件保留的。而是,第三方启动程序通常以项目名称开头。例如,一个名为thirdpartyproject的第三方启动程序项目通常会被命名为thirdpartyproject-spring-boot-starter

Spring Boot 在org.springframework.boot组下提供了以下应用程序启动器:

表 13.1. Spring Boot 应用程序启动器

NameDescriptionPom
spring-boot-starter核心 Starter 工具,包括自动配置支持,日志记录和 YAMLPom
spring-boot-starter-activemq使用 Apache ActiveMQ 的 JMS 消息传递 StarterPom
spring-boot-starter-amqp使用 Spring AMQP 和 Rabbit MQ 的 StarterPom
spring-boot-starter-aop使用 Spring AOP 和 AspectJ 进行面向方面编程的 StarterPom
spring-boot-starter-artemis使用 Apache Artemis 的 JMS 消息传递 StarterPom
spring-boot-starter-batch使用 Spring Batch 的 StarterPom
spring-boot-starter-cache使用 Spring Framework 的缓存支持的 Starter 者Pom
spring-boot-starter-cloud-connectors使用 Spring Cloud Connectors 的 Starter 程序,可简化与 Cloud Foundry 和 Heroku 等云平台中服务的连接Pom
spring-boot-starter-data-cassandra使用 Cassandra 分布式数据库和 Spring Data Cassandra 的 StarterPom
spring-boot-starter-data-cassandra-reactive使用 Cassandra 分布式数据库和 Spring Data Cassandra Reactive 的 StarterPom
spring-boot-starter-data-couchbase使用 Couchbase 面向文档的数据库和 Spring Data Couchbase 的 StarterPom
spring-boot-starter-data-couchbase-reactive使用 Couchbase 面向文档的数据库和 Spring Data Couchbase Reactive 的 StarterPom
spring-boot-starter-data-elasticsearch使用 Elasticsearch 搜索和分析引擎以及 Spring Data Elasticsearch 的 Starter 者Pom
spring-boot-starter-data-jdbc使用 Spring Data JDBC 的 StarterPom
spring-boot-starter-data-jpa将 Spring Data JPA 与 Hibernate 结合使用的 StarterPom
spring-boot-starter-data-ldap使用 Spring Data LDAP 的 StarterPom
spring-boot-starter-data-mongodb使用 MongoDB 面向文档的数据库和 Spring Data MongoDB 的 StarterPom
spring-boot-starter-data-mongodb-reactive使用 MongoDB 面向文档的数据库和 Spring Data MongoDB Reactive 的 StarterPom
spring-boot-starter-data-neo4j使用 Neo4j 图形数据库和 Spring Data Neo4j 的 StarterPom
spring-boot-starter-data-redis使用 Redis 键值数据存储与 Spring Data Redis 和 Lettuce Client 端的 StarterPom
spring-boot-starter-data-redis-reactive将 Redis 键值数据存储与 Spring Data Redis Reacting 和 Lettuce Client 端一起使用的 StarterPom
spring-boot-starter-data-rest使用 Spring Data REST 在 REST 上公开 Spring Data 存储库的 StarterPom
spring-boot-starter-data-solr结合使用 Apache Solr 搜索平台和 Spring Data Solr 的 Starter 者Pom
spring-boot-starter-freemarker使用 FreeMarker 视图构建 MVC Web 应用程序的 StarterPom
spring-boot-starter-groovy-templates使用 Groovy 模板视图构建 MVC Web 应用程序的 StarterPom
spring-boot-starter-hateoas使用 Spring MVC 和 Spring HATEOAS 构建基于超媒体的 RESTful Web 应用程序的 Starter 者Pom
spring-boot-starter-integration使用 Spring Integration 的 StarterPom
spring-boot-starter-jdbc结合使用 JDBC 和 HikariCP 连接池的 StarterPom
spring-boot-starter-jersey使用 JAX-RS 和 Jersey 构建 RESTful Web 应用程序的 Starter。 spring-boot-starter-web的替代品Pom
spring-boot-starter-jooq使用 jOOQ 访问 SQL 数据库的 Starter。替代spring-boot-starter-data-jpaspring-boot-starter-jdbcPom
spring-boot-starter-json读写 JSON StarterPom
spring-boot-starter-jta-atomikos使用 Atomikos 的 JTATransactionStarterPom
spring-boot-starter-jta-bitronix使用 Bitronix 的 JTATransactionStarterPom
spring-boot-starter-mail开始使用 Java Mail 和 Spring Framework 的电子邮件发送支持Pom
spring-boot-starter-mustache使用 Mustache 视图构建 Web 应用程序的 StarterPom
spring-boot-starter-oauth2-client使用 Spring Security 的 OAuth2/OpenID Connect Client 端功能的 StarterPom
spring-boot-starter-oauth2-resource-server使用 Spring Security 的 OAuth2 资源服务器功能的 StarterPom
spring-boot-starter-quartzStarter 使用 Quartz SchedulerPom
spring-boot-starter-security使用 Spring Security 的 StarterPom
spring-boot-starter-test用于使用包括 JUnit,Hamcrest 和 Mockito 在内的库测试 Spring Boot 应用程序的 Starter 程序Pom
spring-boot-starter-thymeleaf使用 Thymeleaf 视图构建 MVC Web 应用程序的 StarterPom
spring-boot-starter-validation通过 Hibernate Validator 使用 Java Bean 验证的 StarterPom
spring-boot-starter-web使用 Spring MVC 构建 Web(包括 RESTful)应用程序的 Starter 者。使用 Tomcat 作为默认的嵌入式容器Pom
spring-boot-starter-web-services使用 Spring Web Services 的 StarterPom
spring-boot-starter-webflux使用 Spring Framework 的反应式 Web 支持构建 WebFlux 应用程序的 Starter 者Pom
spring-boot-starter-websocket使用 Spring Framework 的 WebSocket 支持构建 WebSocket 应用程序的 StarterPom

除应用程序启动程序外,以下启动程序还可用于添加* production ready *功能:

表 13.2 Spring Boot 生产启动器

NameDescriptionPom
spring-boot-starter-actuator使用 Spring Boot 的 Actuator 的 Starter 程序,它提供了生产就绪功能,可帮助您监视和 Management 应用程序Pom

最后,Spring Boot 还包括以下启动程序,如果您想排除或交换特定的技术方面,可以使用这些启动程序:

表 13.3 Spring Boot 技术 Starter

NameDescriptionPom
spring-boot-starter-jetty使用 Jetty 作为嵌入式 servlet 容器的 Starter 者。 spring-boot-starter-tomcat的替代品Pom
spring-boot-starter-log4j2使用 Log4j2 进行日志记录的启动器。 spring-boot-starter-logging的替代品Pom
spring-boot-starter-logging使用 Logback 进行日志记录的启动器。默认记录启动器Pom
spring-boot-starter-reactor-netty使用 Reactor Netty 作为嵌入式反应式 HTTP 服务器的 Starter 者。Pom
spring-boot-starter-tomcat使用 Tomcat 作为嵌入式 servlet 容器的 Starter。 spring-boot-starter-web使用的默认 servlet 容器启动器Pom
spring-boot-starter-undertow使用 Undertow 作为嵌入式 servlet 容器的 Starter。 spring-boot-starter-tomcat的替代品Pom

Tip

有关其他社区贡献的 Starter 者的列表,请参阅 GitHub spring-boot-starters模块中的README file