Maven属性
【Maven】可以自定义一个或多个属性,但是事实上【自定义属性】仅是 6 类【Maven】属性中的其一。【Maven】总的来说有以下几种属性类型:
- 【内置属性】
${basedir}
,项目根目录${version}
,项目版本
- 【POM属性】
${project.artifactId}
,对应了<project>
元素中的<artifactId>
元素的值${project.build.sourceDirectory}
,项目的主源码目录${project.build.testSourceDirectory}
,项目的测试目录${project.build.directory}
:项目构建输出目录${project.outputDirectory}
:项目主代码编译输出目录${project.testOutputDirectory}
:项目测试代码编译输出目录${project.groupId}
:项目的groupId
${project.artifactId}
:项目的artifactId
${project.version}
:项目的版本号${project.build.finalName}
:打包输出文件名,默认为${project.artifactId}-${project.version}
【自定义属性】:在
<properties>
元素里添加自定义标签:<properties>
<my.prop>hello</my.prop>
</properties>
在
pom.xml
中的其他地方使用${my.prop}
时,就会被替换成hello
。【Settings属性】:以
settings.
开头来引用settings.xml
里的属性。比如引用${settings.localRepository}
,则会读取settings.xml
里面的<localRepository>
元素的值- 【Java系统属性】:所有 Java系统属性 都可以用
Maven
引用,比如${user.home}
指向了用户目录。用户可以使用mvn help:system
来查看所有的 Java系统属性。 - 【环境变量属性】:所有环境变量都可以以
env.
开头来引用。比如${env.JAVA_HOME}
就能引用环境变量中的JAVA_HOME
的值。用户可以使用mvn help:system
查看所有的环境变量。
构建环境
通过配置多个 <profile>
可以实现不同环境下的不同配置:
<profiles>
<profile>
<id>dev</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://127.0.0.1:3306/test</db.url>
<db.username>dev</db.username>
<db.password>dev-pwd</db.password>
<build.profile.id>dev</build.profile.id>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://mysq.codeleven.com:3306/prod</db.url>
<db.username>root</db.username>
<db.password>root</db.password>
<build.profile.id>prod</build.profile.id>
</properties>
</profile>
</profiles>
随后在 xxx.properties
里使用变量${db.driver}
、${db.url}
。随后使用mvn -Pdev
来激活dev profile
,使用mvn -Ptest
来激活test profile
。
激活了一个profile
后并不意味着已经结束了,我们配置的属性都会替换哪些配置文件呢?总不能把所有输出的文件都进行替换把?所以有了<filtering>
元素,我们需要指定哪些目录需要打包到输出文件夹里,哪些目录是需要特殊处理的(替换占位符):
<profiles>
<profile>
<id>test</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://127.0.0.1:3306/test</db.url>
<db.username>dev</db.username>
<db.password>dev-pwd</db.password>
</properties>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering> <!-- 指示需要将src/main/resources文件输出到classes目录下,并且需要对 xxx.xml、xxx.properties 类型的文件进行过滤(特殊处理) -->
</resource>
</resources>
</build>
</profile>
</profiles>
激活Profile方式
命令行激活
mvn clean install -Pdev-x,dev-y
激活dev-x
和dev-y
两个profile
settings文件显示激活
如果希望某个profile
作为默认激活选项,可以配置settings.xml
里的<activeProfiles>
元素。
<settings>
<activeProfiles>
<activeProfile>dev-x</activeProfile>
</activeProfiles>
</settings>
配置了该选项后,那么所有pom.xml
都默认激活dev-x
的<profile>
。
系统属性激活
用户可以根据 某个系统属性 来决定是否激活该profile
。
<profiles>
<profile>
<id>dev</id>
<activation>
<property>
<name>test</name>
<value>x</value> <!-- 只有Maven环境中同时有 test 和 x 才会激活 -->
</property>
</activation>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://127.0.0.1:3306/test</db.url>
<db.username>dev</db.username>
<db.password>dev-pwd</db.password>
<build.profile.id>dev</build.profile.id>
</properties>
</profile>
</profiles>
当系统属性中存在<name>
字段,那么就激活profile=dev
。换句话说,通过-DpropertyKey=propertyVal
来设置,和命令行激活十分相似。
操作系统环境激活
用户可以根据操作系统环境来激活profile
。
<profiles>
<profile>
<id>dev</id>
<activation>
<os>
<name>Windows XP</name>
<family>Windows</family>
</os>
</activation>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://127.0.0.1:3306/test</db.url>
<db.username>dev</db.username>
<db.password>dev-pwd</db.password>
<build.profile.id>dev</build.profile.id>
</properties>
</profile>
</profiles>
只有操作系统名字是Windows XP
且操作系统系列是Windows
才激活这个profile=dev
。
默认激活
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://127.0.0.1:3306/test</db.url>
<db.username>dev</db.username>
<db.password>dev-pwd</db.password>
<build.profile.id>dev</build.profile.id>
</properties>
</profile>
</profiles>
使用activeByDefault
元素可以默认使用profile
来激活。倘若此时有其他的<profile>
被激活了,那么<activeByDefault>
的<profile>
就不会生效。换句话说,仅在没有其他<profile>
生效的情况下,默认激活的 <profile>
才会生效。
企业级使用
在实际使用过程中,不会直接在 <profile>
内的 <properties>
元素里直接配置项目,而是会把各个环境的配置文件分别放到各自的一个文件夹里。打个比方:
- 所有
dev
的配置,会放在src/main/resources/dev/
文件夹下 - 所有
beta
的配置,会放在src/main/resources/beta/
文件夹下 - 所有
test
的配置,会放在src/main/resources/test/
文件夹下 - 所有
staging
的配置,会放在src/main/resources/staging/
文件夹下 - 所有
prod
的配置,会放在src/main/resources/prod/
文件夹下
然后仍然利用之前的<profile>
机制来决定将 哪个环境的配置文件夹 输出到约定好的 classes/
目录下:
<profiles>
<!-- Dev 环境的配置 -->
<profile>
<id>dev</id>
<build>
<resources>
<resource>
<directory>src/main/resources/dev</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</profile>
<!-- Beta 环境的配置 -->
<profile>
<id>dev</id>
<build>
<resources>
<resource>
<directory>src/main/resources/beta</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</profile>
<!-- Test 环境的配置 -->
<profile>
<id>dev</id>
<build>
<resources>
<resource>
<directory>src/main/resources/test</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</profile>
...
</profiles>
这样只需要激活某一个profile
,那么对应的环境的配置文件就会输出到classes/
目录里。