spring_reference/build_tool_plugins.md

9.5 KiB
Raw Blame History

构建工具插件

Spring Boot为Maven和Gradle提供构建工具插件。该插件提供各种各样的特性包括打包可执行jars。本节提供关于插件的更多详情及用于扩展一个不支持的构建系统所需的帮助信息。如果你是刚刚开始那可能需要先阅读Part III, “Using Spring Boot”章节的“Chapter 13, Build systems”

Spring Boot Maven插件

Spring Boot Maven插件为Maven提供Spring Boot支持它允许你打包可执行jar或war存档然后就地运行应用。为了使用它你需要使用Maven 3.2 (或更高版本)。

:参考Spring Boot Maven Plugin Site可以获取全部的插件文档。

  • 包含该插件

想要使用Spring Boot Maven插件只需简单地在你的pom.xml的plugins部分包含相应的XML

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- ... -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.3.0.BUILD-SNAPSHOT</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

该配置会在Maven生命周期的package阶段重新打包一个jar或war。下面的示例显示在target目录下既有重新打包后的jar也有原始的jar

$ mvn package
$ ls target/*.jar
target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original

如果不包含像上面那样的<execution/>你可以自己运行该插件但只有在package目标也被使用的情况。例如

$ mvn package spring-boot:repackage
$ ls target/*.jar
target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original

如果使用一个里程碑或快照版本你还需要添加正确的pluginRepository元素

<pluginRepositories>
    <pluginRepository>
        <id>spring-snapshots</id>
        <url>http://repo.spring.io/snapshot</url>
    </pluginRepository>
    <pluginRepository>
        <id>spring-milestones</id>
        <url>http://repo.spring.io/milestone</url>
    </pluginRepository>
</pluginRepositories>
  • 打包可执行jar和war文件

一旦spring-boot-maven-plugin被包含到你的pom.xml中它就会自动尝试使用spring-boot:repackage目标重写存档以使它们能够执行。为了构建一个jar或war你应该使用常规的packaging元素配置你的项目

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- ... -->
    <packaging>jar</packaging>
    <!-- ... -->
</project>

生成的存档在package阶段会被Spring Boot增强。你想启动的main类即可以通过指定一个配置选项也可以通过为manifest添加一个Main-Class属性这种常规的方式实现。如果你没有指定一个main类该插件会搜索带有public static void main(String[] args)方法的类。

为了构建和运行一个项目的artifact你可以输入以下命令

$ mvn package
$ java -jar target/mymodule-0.0.1-SNAPSHOT.jar

为了构建一个即是可执行的又能部署到一个外部容器的war文件你需要标记内嵌容器依赖为"provided",例如:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- ... -->
    <packaging>war</packaging>
    <!-- ... -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- ... -->
    </dependencies>
</project>

:具体参考“Section 74.1, “Create a deployable war file”” 章节。

插件信息页面有高级的配置选项和示例。

Spring Boot Gradle插件

Spring Boot Gradle插件为Gradle提供Spring Boot支持它允许你打包可执行jar或war存档运行Spring Boot应用对于"神圣的"依赖可以在你的build.gradle文件中省略版本信息。

  • 包含该插件

想要使用Spring Boot Gradle插件你只需简单的包含一个buildscript依赖,并应用spring-boot插件:

buildscript {
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.0.BUILD-SNAPSHOT")
    }
}
apply plugin: 'spring-boot'

如果想使用一个里程碑或快照版本你可以添加相应的repositories引用

buildscript {
    repositories {
        maven.url "http://repo.spring.io/snapshot"
        maven.url "http://repo.spring.io/milestone"
    }
    // ...
}
  • 声明不带版本的依赖

spring-boot插件会为你的构建注册一个自定义的Gradle ResolutionStrategy,它允许你在声明对"神圣"的artifacts的依赖时获取版本号。为了充分使用该功能只需要想通常那样声明依赖但将版本号设置为空

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.thymeleaf:thymeleaf-spring4")
    compile("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect")
}

:你声明的spring-boot Gradle插件的版本决定了"blessed"依赖的实际版本(确保可以重复构建)。你最好总是将spring-boot gradle插件版本设置为你想用的Spring Boot实际版本。提供的版本详细信息可以在附录中找到。

spring-boot插件对于没有指定版本的依赖只会提供一个版本。如果不想使用插件提供的版本,你可以像平常那样在声明依赖的时候指定版本。例如:

dependencies {
    compile("org.thymeleaf:thymeleaf-spring4:2.1.1.RELEASE")
}
  • 自定义版本管理

如果你需要不同于Spring Boot的"blessed"依赖,有可能的话可以自定义ResolutionStrategy使用的版本。替代的版本元数据使用versionManagement配置。例如:

dependencies {
    versionManagement("com.mycorp:mycorp-versions:1.0.0.RELEASE@properties")
    compile("org.springframework.data:spring-data-hadoop")
}

版本信息需要作为一个.properties文件发布到一个仓库中。对于上面的示例,mycorp-versions.properties文件可能包含以下内容:

org.springframework.data\:spring-data-hadoop=2.0.0.RELEASE

属性文件优先于Spring Boot默认设置如果有必要的话可以覆盖版本号。

  • 默认排除规则

Gradle处理"exclude rules"的方式和Maven稍微有些不同在使用starter POMs时这可能会引起无法预料的结果。特别地当一个依赖可以通过不同的路径访问时对该依赖声明的exclusions将不会生效。例如如果一个starter POM声明以下内容

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.0.5.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.0.5.RELEASE</version>
    </dependency>
</dependencies>

commons-logging jar不会被Gradle排除因为通过没有exclusion元素的spring-context可以传递性的拉取到它spring-context → spring-core → commons-logging

为了确保正确的排除被实际应用Spring Boot Gradle插件将自动添加排除规则。所有排除被定义在spring-boot-dependencies POM并且针对"starter" POMs的隐式规则也会被添加。

如果不想自动应用排除规则,你可以使用以下配置:

springBoot {
    applyExcludeRules=false
}
  • 打包可执行jar和war文件

一旦spring-boot插件被应用到你的项目,它将使用bootRepackage任务自动尝试重写存档以使它们能够执行。为了构建一个jar或war你需要按通常的方式配置项目。