Maven插件系列之spring-boot-maven-plugin

Spring Boot 的 Maven 插件(Spring Boot Maven plugin)能够以 Maven 的方式为应用提供 Spring Boot 的支持,即为 Spring Boot 应用提供了执行 Maven 操作的可能。
Spring Boot Maven plugin 能够将 Spring Boot 应用打包为可执行的 jar 或 war 文件,然后以通常的方式运行 Spring Boot 应用。
Spring Boot Maven plugin 的最新版本为 2017.6.8 发布的 1.5.4.RELEASE,要求 Java 8, Maven 3.2 及以后。

Spring Boot Maven plugin 的 5 个 Goals

  • spring-boot:repackage,默认 goal。在 mvn package 之后,再次打包可执行的 jar/war,同时保留 mvn package 生成的 jar/war 为.origin
  • spring-boot:run,运行 Spring Boot 应用
  • spring-boot:start,在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理
  • spring-boot:stop,在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理
  • spring-boot:build-info,生成 Actuator 使用的构建信息文件 build-info.properties

2. 配置 pom.xml 文件

复制代码
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.0.1.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
复制代码

3.mvn package spring-boot:repackage 说明

Spring Boot Maven plugin 的最主要 goal 就是 repackage,其在 Maven 的 package 生命周期阶段,能够将 mvn package 生成的软件包,再次打包为可执行的软件包,并将 mvn package 生成的软件包重命名为 *.original。

基于上述配置,对一个生成 Jar 软件包的项目执行如下命令

mvn package spring-boot:repackage  

可以看到生成的两个 jar 文件,一个是 *.jar,另一个是 *.jar.original。

 

在执行上述命令的过程中,Maven 首先在 package 阶段打包生成 *.jar 文件;然后执行 spring-boot:repackage 重新打包,查找 Manifest 文件中配置的 Main-Class 属性,如下所示:

复制代码
Manifest-Version: 1.0  
Implementation-Title: gs-consuming-rest  
Implementation-Version: 0.1.0  
Archiver-Version: Plexus Archiver  
Built-By: exihaxi  
Implementation-Vendor-Id: org.springframework  
Spring-Boot-Version: 1.5.3.RELEASE  
Implementation-Vendor: Pivotal Software, Inc.  
Main-Class: org.springframework.boot.loader.JarLauncher  
Start-Class: com.ericsson.ramltest.MyApplication  
Spring-Boot-Classes: BOOT-INF/classes/  
Spring-Boot-Lib: BOOT-INF/lib/  
Created-By: Apache Maven 3.5.0  
Build-Jdk: 1.8.0_131  
复制代码

注意,其中的 Main-Class 属性值为 org.springframework.boot.loader.JarLauncher;

Start-Class 属性值为 com.ericsson.ramltest.MyApplication。

其中 com.ericsson.ramltest.MyApplication 类中定义了 main() 方法,是程序的入口。

通常,Spring Boot Maven plugin 会在打包过程中自动为 Manifest 文件设置 Main-Class 属性,事实上该属性究竟作用几何,还可以受 Spring Boot Maven plugin 的配置属性 layout 控制的,示例如下

复制代码
<plugin>  
  <groupId>org.springframework.boot</groupId>  
  <artifactId>spring-boot-maven-plugin</artifactId>  
  <version>1.5.4.RELEASE</version>  
  <configuration>  
    <mainClass>${start-class}</mainClass>  
    <layout>ZIP</layout>  
  </configuration>  
  <executions>  
    <execution>  
      <goals>  
        <goal>repackage</goal>  
      </goals>  
    </execution>  
  </executions>  
</plugin> 
复制代码

注意,这里的 layout 属性值为 ZIP。

 

layout 属性的值可以如下:

  • JAR,即通常的可执行 jar

Main-Class: org.springframework.boot.loader.JarLauncher

  • WAR,即通常的可执行 war,需要的 servlet 容器依赖位于 WEB-INF/lib-provided

Main-Class: org.springframework.boot.loader.warLauncher

  • ZIP,即 DIR,类似于 JAR

Main-Class: org.springframework.boot.loader.PropertiesLauncher

  • MODULE,将所有的依赖库打包(scope 为 provided 的除外),但是不打包 Spring Boot 的任何 Launcher
  • NONE,将所有的依赖库打包,但是不打包 Spring Boot 的任何 Launcher

4.integration-test 阶段中的 Spring Boot Maven plugin 的 start/stop

复制代码
<properties>  
  <it.skip>false</it.skip>  
</properties>  
<build>  
  <plugins>  
    <plugin>  
      <groupId>org.apache.maven.plugins</groupId>  
      <artifactId>maven-failsafe-plugin</artifactId>  
      <configuration>  
        <skip>${it.skip}</skip>  
      </configuration>  
    </plugin>  
    <plugin>  
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-maven-plugin</artifactId>  
      <version>1.5.4.RELEASE</version>  
      <executions>  
        <execution>  
          <id>pre-integration-test</id>  
          <goals>  
            <goal>start</goal>  
          </goals>  
          <configuration>  
            <skip>${it.skip}</skip>  
          </configuration>  
        </execution>  
        <execution>  
          <id>post-integration-test</id>  
          <goals>  
            <goal>stop</goal>  
          </goals>  
          <configuration>  
            <skip>${it.skip}</skip>  
          </configuration>  
        </execution>  
      </executions>  
    </plugin>  
  </plugins>  
</build>  
复制代码

注意,it.skip 变量用作是否跳过 integration-test 的标志位。

maven-failsafe-plugin 用作 integration-test 的主要执行目标。

spring-boot-maven-plugin 用以为 integration-test 提供支持。

执行 integration-test 的 Maven 命令如下:

mvn verify

或者

mvn verify -Dit.skip=false

参考链接:68. Spring Boot Maven Plugin

http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/maven-plugin/
https://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html

 

原文地址:https://www.cnblogs.com/liaojie970/p/9007577.html