概述

build标签描述了如何编译及打包项目,具体的编译和打包工作是通过其中的plugin配置来完成的。当然,plugin不是必须的,默认情况下,Maven会绑定以下几个插件来完成基本操作

life cycle phase

plugin

描述

clean

maven-clean-plugin

清理上一次执行创建的目标文件。

resources

maven-resources-plugin

处理资源文件和测试资源文件。

compile

maven-compiler-plugin

编译源文件和测试源文件。

test

maven-surefire-plugin

执行测试文件。

jar

maven-jar-plugin

创建jar。

install

maven-install-plugin

安装jar。

deploy

maven-deploy-plugin

发布jar。

如果有需要可以另外进行配置,以下配置了编译时使用的jdk版本。

<build>  
    ...  
    <plugins>
       <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
          <configuration>
             <source>1.7</source>
             <target>1.7</target>
          </configuration>
        </plugin>
    </plugins>
    ...  
</build>

build

标签build包含以下元素:

标签

类型

描述

sourceDirectory

String

指定一个目录包含项目的来源。生成的构建系统将从这个目录编译源代码。默认值是 src/main/java

scriptSourceDirectory

String

指定一个目录包含项目的脚本来源。默认值是 src/main/scripts

testSourceDirectory

String

指定一个目录包含项目的单元测试源。 默认值是 src/test/java

outputDirectory

String

编译应用程序类放置的目录。 默认值是target/classes

testOutputDirectory

String

编译测试类放置的目录。 默认值是target/test-classes

extensions

List<extension>

用于构建扩展使用

filters

List<String>

过滤器属性的列表文件。启用过滤时使用

defaultGoal

String

默认目标Goal

directory

String

生成所有文件的目录。 默认值是target

finalName

String

生成最终文件名。默认值是${artifactId}-${version}

resources

List<resource>

描述了类路径的所有资源。默认是src/main/resources

testResources

List<resource>

描述了类路径的所有测试相关的资源。默认是src/test/resources

pluginManagement

pluginManagement

父项目统一配置的插件列表。这个插件配置不会或绑定到生命周期,除非子模块引用。

plugins

List<plugin>

插件列表

build标签根据不同的位置分为两种:

  • project build
  • 全局配置。针对整个项目的所有情况都有效
  • 包含了build的基本元素和<sourceDirectory>、<scriptSourceDirectory>、<testSourceDirectory>、<outputDirectory>、<testOutputDirectory>
  • profile build
  • 在profile标签中。针对不同的profile配置
  • 只包含了build的基本元素

基本元素示例:

<build>  
   <defaultGoal>install</defaultGoal>  
   <directory>${basedir}/target</directory>  
   <finalName>${artifactId}-${version}</finalName> 
   <filters>
      <filter>filters/filter1.properties</filter>
   </filters> 
   ...
</build>

注:maven的默认filter文件夹为${basedir}/src/main/filters。定义在filter的文件中的name=value键值对,会在build时代替${name}值应用到resources中。

resource

配置各个资源在maven项目中的具体路径。用于包含或者排除某些资源文件。标签resource包含以下元素:

标签

类型

描述

targetPath

String

指定build后的resource存放的文件夹,默认是basedir。通常被打包在jar中的resources的目标路径是META-INF

filtering

String

表示为这个resource,filter是否激活,默认false。

directory

String

资源文件源路径,默认位于${basedir}/src/main/resources/目录下。

includes

List<String>

一组文件名的匹配模式,被匹配的资源文件将被构建过程处理。

excludes

List<String>

一组文件名的匹配模式,被匹配的资源文件将被构建过程忽略。

示例:

<build>  
    ...  
    <filters>
       <filter>filters/filter1.properties</filter>
    </filters>
    <resources>  
       <resource>  
          <targetPath>META-INF/plexus</targetPath>  
          <filtering>true</filtering>  
          <directory>${basedir}/src/main/plexus</directory>  
          <includes>  
             <include>configuration.xml</include>  
          </includes>  
          <excludes>  
             <exclude>**/*.properties</exclude>  
          </excludes>  
       </resource>  
    </resources>  
    <testResources>  
        ...  
    </testResources>  
    ...  
</build>

plugin

设置构建过程中需要的插件。标签plugin包含以下元素:

标签

类型

描述

groupId

String

插件全局惟一的标识符

artifactId

String

插件唯一模块ID

version

String

插件版本号

extensions

String

是否加载该插件的扩展,默认false。

executions

List<PluginExecution>

该插件的某个goal的执行方式。

dependencies

List<dependency>

该插件所需要的依赖类库。

inherited

String

该插件的configuration中的配置是否可以被继承。默认true。

configuration

DOM

该插件所需要的特殊配置,在父子项目之间可以覆盖或合并。

示例:

<build>  
    ...  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-jar-plugin</artifactId>  
            <version>2.0</version>  
            <extensions>false</extensions>  
            <inherited>true</inherited>  
            <configuration>  
                <classifier>test</classifier>  
            </configuration>  
            <dependencies>...</dependencies>  
            <executions>...</executions>  
        </plugin>  
    </plugins>  
</build>

execution

execution元素包含了插件执行需要的信息。

标签

类型

描述

id

String

执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标

phase

String

绑定目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段

goals

List<goal>

配置的执行目标

inherited

String

配置是否被传递到子POM

configuration

DOM

DOM对象的配置

configuration

不管是plugin还是execution都有元素configuration,该标签包含的元素和插件执行目标相关,为插件执行目标提供自定义传参。所以,configuration内元素各不相同,和执行目标提供的对外参数相关。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http:///POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http:///POM/4.0.0 http:///xsd/maven-4.0.0.xsd">
    ...
    
    <build>
        <plugins>
            <!-- 使用spring-boot-maven-plugin打包独立可执行程序 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.4.2.RELEASE</version>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <finalName>milkyway-pc</finalName>
                    <classifier>1.0-SNAPSHOT</classifier>
                    <outputDirectory>../target</outputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

上述使用了Maven常用插件 spring-boot-maven-plugin,使用该插件的默认goal:repackage(使用标签executions),该goal会在mvn package之后,再次打包可执行的jar/war,并将mvn package生成的软件包重命名为*.original。
使用标签configuration为插件spring-boot-maven-plugin传参,配置最终生成的jar名。注:该configuration内的元素可以参考插件spring-boot-maven-plugin提供了哪些对外配置参数。
spring-boot-maven-plugin 见《Maven-build之spring-boot-maven-plugin》

pluginManagement

pluginManagement的配置和plugins的配置是一样的,只是用于继承,使得可以在孩子pom中使用。
父pom:

<build>  
    ... 
    <pluginManagement>  
        <plugins>  
            <plugin>  
              <groupId>org.apache.maven.plugins</groupId>  
              <artifactId>maven-jar-plugin</artifactId>  
              <version>2.2</version>  
                <executions>  
                    <execution>  
                        <id>pre-process-classes</id>  
                        <phase>compile</phase>  
                        <goals>  
                            <goal>jar</goal>  
                        </goals>  
                        <configuration>  
                            <classifier>pre-process</classifier>  
                        </configuration>  
                    </execution>  
                </executions>  
            </plugin>  
        </plugins>  
    </pluginManagement>  
    ...  
</build>

子pom中,我们只需要配置:

<build>  
    ...  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-jar-plugin</artifactId>  
        </plugin>  
    </plugins>  
    ...  
</build>

大大简化了孩子pom的配置。

…Directory

往往配置在父项目中,供所有父子项目使用。目录可以使用绝对路径,若使用相对路径,则都是在${basedir}目录下。根据“约定大于配置”的原则,一般不需要自定义配置,使用默认配置即可。

Maven多环境配置实战 filter

详见《Maven-build结合profile实现多环境配置实战》