概述
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://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">
...
<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实现多环境配置实战》