maven属性
maven自带的一些常用属性:
- ${project.build.sourceDirectory} 项目主代码根目;src/main/java/
- ${project.build.testSourceDirectory}项目测试代码根目录,src/test/java/
- ${project.outputDirectory}项目主代码编译输出目录,默认是target/classes
- ${project.build.directory}项目构建输出根目录,默认为target/
- ${project.groupId}项目groupId
- ${project.artifactId} 项目artifactId
- ${project.version} 项目的version
- {project.artifactId}-${project.version}
- …
自定义属性:用户可以在pom文件的properties元素下自定义自己的属性,也可以在profile中自定义属于profile的属性。
在Pom中:
<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/maven-v4_0_0.xsd">
// 此处省略其他东西
<properties>
<my.pro>hello</my.pro>
</properties>
</project>
除此之外,java系统属性和环境变量属性都可以作为maven的属性。比如:
-
${user.home}
就是指向了用户目录,可以通过mvn help:system
查看java系统支持的属性。 -
${env.JAVA_HOME}
指代的就是系统环境变量中的JAVA_HOME 配置的值。
多profile配置
有时候,我们需要针对不同环境配置打包项目,比如生产环境和开发环境使用不一样的数据库配置,直接修改配置文件然后构建是手动行为,效率低下且容易出错。maven提供一种自动根据不同配置构建项目的方法–使用profile。
每个profile就是一个配置,使用maven构建的时候,指定激活某个profile就可以使用某套配置。
在properties配置文件中我们可以使用这种配置。
database.jdbc.driverClass=${db.driver}
database.jdbc.url=${db.url}
...
然后在maven的配置文件中指定profile
<profiles>
<profile>
<id>test</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.username>root</db.username>
<db.password>abc</db.password>
<db.url>jdbc:mysql://localhost:3306/test?useSSL=true</db.url>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.username>root</db.username>
<db.password>abc</db.password>
<db.url>jdbc:mysql://localhost:3306/dev?useSSL=true</db.url>
</properties>
</profile>
</profiles>
说明:
- id 指明profile的id标识
- properties 中定义一些该profile的属性。
这样还没算完成,默认情况下,只有pom文件中的maven属性会被替换,在资源文件.properties文件中的${db.url}
不会在构建的时候被替换,我们要让maven解析资源文件替换掉那些属性,就需要使用到maven的插件:maven-resource-plugin
。
这个插件默认只是将资源目录下的文件拷贝到编译输出目录,但可以通过简单的配置改变他的行为,来开启资源文件过滤,并且可以指定过滤规则。
在父pom中开启资源文件filter示例:
<build>
<finalName>profile-test</finalName>
<!--开启主目录下资源文件过滤-->
<resources>
<resource>
<filtering>true</filtering>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>*.properties</include>
</includes>
</resource>
</resources>
<!--开启测试目录下资源文件过滤-->
<testResources>
<testResource>
<filtering>true</filtering>
<directory>${project.basedir}/src/test/resources</directory>
<!--包括哪些-->
<includes>
<include>*.properties</include>
</includes>
<!--排除哪些-->
<!--<excludes>-->
<!--<exclude>*.xml</exclude>-->
<!--</excludes>-->
</testResource>
</testResources>
</build>
配置好之后,编译打包时,maven插件会将资源文件中引用到maven属性的地方的字符串替换成maven属性的值,生成打包后的文件。
目前准备工作已经做完了,直接使用如下命令就可以激活profile来构建项目。
mvn clean package -Dmaven.test.skip=true -Pdev
参数说明:
-Dmaven.test.skip=true
指定构建的时候跳过测试代码的编译和测试。
-P
指定激活的profile
,这里的dev就是pom文件中对应的profile的id,可以指定多个profile,profile之间用逗号隔开。
那么,如果我们想在开发的时候使用默认的一个profile,省去构建的时候指定-P
参数的传入,可以在默认的profile配置中指定activation的activeByDefault为true,如下:
<profile>
<id>dev</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.username>root</db.username>
<db.password>vinfung77</db.password>
<db.url>jdbc:mysql:///dev?useSSL=true</db.url>
</properties>
<!--默认激活-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
profile 的种类
- pom.xml文件中指定的profile
- 用户settings.xml文件,
.m2/settings.xml
中指定的profile - 全局settings.xml文件,
conf/settings.xml
中指定的profile
setting.xml:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
//此处省略其他无关的
<profiles>
//在这里配置profile
</profiles>
<!-- 指定默认激活哪些profile
<activeProfiles>
<activeProfile>alwaysActiveProfile</activeProfile>
<activeProfile>anotherAlwaysActiveProfile</activeProfile>
</activeProfiles>
-->
</settings>