前言
在很多情况下,我们希望项目在不同的阶段有不同的构建,开发的时候,使用开发的环境配置,测试的时候,使用测试的环境配置,上线的时候使用其他的配置,虽然说,每次切换项目运行的环境的时候,我们可以手动更改配置,但这样难免有疏漏之处,导致项目构建的失败。这个时候,我们就需要Maven进行灵活的构建,使用属性、profile和资源过滤三个特性达到根据不同的环境构建项目的目的。
一、Maven 属性
最常见的用法–自定义的Maven属性
使用properties自定义属性,,然后使用${}引用上满定义的属性
<-定义属性--->
<properties>
<oneVirsion>xxxxx</oneVirsion>
</properties>
<!--使用属性-->
<dependencyManagement>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>${oneVirsion}</version>
</dependency>
</dependencyManagement>
maven内置的属性
主要有两个内置属性
- ${basedir} 表示项目的根目录,即包含pom.xml的目录
- ${version} 表示项目的版本
POM属性
用户可以使用引用POM文件对应元素的值,例如${project.artifacId},对应了< project > < aritfactId >元素的值。
常用属性
${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java
${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java
${project.build.directory}:项目构件输出目录,默认为target/
${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes/
${project.testOutputDirectory}:项目测试代码编译输出目录,默认为target/test-classes/
${project.groupId}:项目的groupId
${project.artifactId}:项目的artifactId
${project.version}:项目的version,与${version}等价
${project.build.fianlName}:项目打包输出文件的名称。默认为${project.artifactId}-${project.version}
settings.xml 属性
可以使用sttings. 开头的属性引用settings.xml文件中XML元素的值,例如常用的${settings.localRespository}指向用户本地仓库的地址。
Java系统属性
所有的Java系统属性都可以使用Maven属性引用。例如${user.home}指向了用户目录。可以使用mvn help:system 查看所有的Java系统属性。
环境变量属性
所有的环境边浪都可以使用以env.开头的Maven属性引用。例如${env.JAVA_HOME},指代了JAVA_HOME环境变量的值。用户可以使用mvn help:system查看所有的环境变量。
二、资源过滤
上面说了Maven有哪些属性可以使用,但是,只有在pom文件中,$ {xxx}才会被解析,如何在项目的配置文件中(例如日志配置文件、数据库配置文件等)使用${xxx}呢?我们需要配置Maven对含有 ${}属性引用的项目配置文件进行文本替换,具体方式就是,配置资源的过滤。
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<!--开启资源过滤,项目构建时会将当前资源文件中Maven的属性文件替换为配置的文件-->
<filtering>true</filtering>
</resource>
</resources>
这里需要注意以下几点:
- 超级pom中定义了项目默认的资源文件夹为${project.basedir}/src/main/resources
- 需要开启资源过滤
下面举个例子:
开启资源过滤
引用Maven属性
查看项目构建后,Maven属性有没有替换
图中显示Maven属性已经被替换。
三、profile
profile允许你定义一个环境,在这个环境中你可以自由定制自己所需的项目构建方式。
下面,结合上面介绍的Maven属性和资源过滤,实现不同环境下,配置文件中的desc被配置成不同的值:
配置自定义属性,并开启资源过滤
<?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>
<groupId>com.souche</groupId>
<artifactId>log-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>log-demo</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<profiles>
<!--不同构建环境下,desc配置不同的值-->
<profile>
<id>p1</id>
<properties>
<desc>profile的id为p1时,啦啦啦啦</desc>
</properties>
</profile>
<profile>
<id>p2</id>
<properties>
<desc>profile的id为p2时,嘟嘟嘟嘟嘟</desc>
</properties>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<!--配置资源过滤-->
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
配置文件中引用profile中自定义的属性。
构建项目,并激活(有多种方式,我们先选命令行激活的方式)不同profile
- 激活p1
mvn clean package -DskipTests -Pp1
结果
- 激活p2
mvn clean package -DskipTests -Pp2
结果
3.1、profile配置
Profile能让你为一个特殊的环境自定义一个特殊的构建;profile使得不同环境间构建的可移植性成为可能。Maven中的profile是一组可选的配置,可以用来设置或者覆盖配置默认值。有了profile,你就可以为不同的环境定制构建。profile可以在pom.xml中配置,并给定一个id。然后你就可以在运行Maven的时候使用的命令行标记告诉Maven运行特定profile中的目标。一个Profiles下面允许出现的元素:
<project>
<profiles>
<profile>
<build>
<defaultGoal>...</defaultGoal>
<finalName>...</finalName>
<resources>...</resources>
<testResources>...</testResources>
<plugins>...</plugins>
</build>
<reporting>...</reporting>
<modules>...</modules>
<dependencies>...</dependencies>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<properties>...</properties>
</profile>
</profiles>
</project>
3.2、激活profile
命令行激活
使用-P参数,后面紧跟profile的id来激活profile
例如上面的例子
mvn clean package -DskipTests -Pp2
其他激活方式还有settings文件激活、系统属性激活、操作系统换将激活、默认激活等其他方式