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 模块以及精炼的第三方库列表。该列表可作为标准物料清单(Spring 引导相关性)提供,同时还提供对MavenGradle的其他专用支持。

Warning

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

13.2 Maven

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

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

  • UTF-8 源编码。

  • 依赖性 Management 部分,您可以省略_继承自spring-boot-dependencies POM 的<version>标签。

  • Sensible resource filtering.

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

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

最后一点:由于默认配置文件接受 Spring 样式占位符(${…}),因此 Maven 过滤已更改为使用@[email protected]占位符(您可以使用 Maven 属性resource.delimiter覆盖它)。

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>1.5.9.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>1.5.9.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>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.9.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Note

在上面的示例中,我们指定了* BOM *,但是任何依赖项类型都可以用这种方式覆盖。

13.2.3 更改 Java 版本

spring-boot-starter-parent选择相当保守的 Java 兼容性。如果要遵循我们的建议并使用更高的 Java 版本,可以添加java.version属性:

<properties>
    <java.version>1.8</java.version>
</properties>

13.2.4 使用 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

Gradle 用户可以在其dependencies部分中直接导入“启动器”。与 Maven 不同,没有要导入的“超级父级”来共享某些配置。

repositories {
    jcenter()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.5.9.RELEASE")
}

spring-boot-gradle-plugin也可用,并提供创建可执行 jar 和从源代码运行项目的任务。除其他功能外,它还提供dependency management,它允许您忽略由 Spring BootManagement 的任何依赖项的版本号:

plugins {
    id 'org.springframework.boot' version '1.5.9.RELEASE'
    id 'java'
}

repositories {
    jcenter()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

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="1.5.9.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模块,请参阅* 第 84.10 节“不使用 spring-boot-antlib 从 Ant 构建可执行 Files” *“操作方法”。

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 工件保留的。 acme的第三方启动器通常称为acme-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-couchbase使用 Couchbase 面向文档的数据库和 Spring Data Couchbase 的 StarterPom
spring-boot-starter-data-elasticsearch使用 Elasticsearch 搜索和分析引擎以及 Spring Data Elasticsearch 的 Starter 者Pom
spring-boot-starter-data-gemfire使用 GemFire 分布式数据存储和 Spring Data GemFire 的 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-neo4j使用 Neo4j 图形数据库和 Spring Data Neo4j 的 StarterPom
spring-boot-starter-data-redis将 Redis 键值数据存储与 Spring Data Redis 和 JedisClient 端一起使用的 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 和 Tomcat JDBC 连接池的 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-jta-atomikos使用 Atomikos 的 JTATransactionStarterPom
spring-boot-starter-jta-bitronix使用 Bitronix 的 JTATransactionStarterPom
spring-boot-starter-jta-narayanaSpring Boot Narayana JTAStarterPom
spring-boot-starter-mail开始使用 Java Mail 和 Spring Framework 的电子邮件发送支持Pom
spring-boot-starter-mobile使用 Spring Mobile 构建 Web 应用程序的 StarterPom
spring-boot-starter-mustache使用 Mustache 视图构建 MVC Web 应用程序的 StarterPom
spring-boot-starter-security使用 Spring Security 的 StarterPom
spring-boot-starter-social-facebookStarters 使用 Spring Social FacebookPom
spring-boot-starter-social-linkedin使用 Spring Social LinkedIn 的 StaterPom
spring-boot-starter-social-twitter使用 Spring Social Twitter 的 Starter 者Pom
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-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-starter-remote-shell使用 CRaSH 远程 Shell 通过 SSH 监视和 Management 您的应用程序的 Starter。从 1.5 开始不推荐使用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-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