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/目录里。
