文章目录
内置属性
${basedir}:表示项目根目录,即包含pom.xml文件的目录
${version}:表示项目的版本号
POM属性
${pom.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/
${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/
${project.build.directory}:项目构建输出目录,默认为target/
${project.build.outputDirectory}:项目主代码编译输出目录,默认为target/classes
${project.build.testOutputDirectory}:项目测试代码编译输出目录,默认为target/test-classes
${project.groupId}:项目的groupId
${project.artifactId}:项目的artifactId
${project.version}:项目的version,与${version}等价
${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}
Settings属性
这种属性以settings.
开头来引用~/.m2/settings.xml
中的内容,如:
#指向用户本地仓库的地址。
${settings.localRepository}
java系统属性
所有java系统属性
都可以使用maven
属性来进行引用,例如${user.home}
指向了当前用户目录。
java
系统属性可以通过mvn help:system
命令看到。
环境变量属性
所有的环境变量都可以使用env.开头的方式来进行引用,如:
# 可以获取环境变量JAVA_HOME的值。
${env.JAVA_HOME}
用户可以使用
mvn help:system
命令查看所有环境变量的值。
上面的maven
属性,我们在pom.xml中通过${属性名称}
可以灵活的引用,对我们写pom.xml
文件帮助还是比较大的。
案例
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 配置maven编译的时候采用的编译器版本 -->
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<!-- 指定源代码是什么版本的 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!-- maven中执行编译的时候会用到这个配置 -->
<maven.compiler.target>1.8</maven.compiler.target>
<!-- [maven 属性引用: 通过命令查看变量内容: mvn help:effective-pom > mvn.xml] /-->
<!-- 项目的主源码目录,默认为src/main/java/ -->
<a>${pom.build.sourceDirectory}</a>
<!-- 项目的测试源码目录,默认为src/test/java/ -->
<b>${project.build.testSourceDirectory}</b>
<!-- 项目构建输出目录,默认为target/ -->
<c>${project.build.directory}</c>
<!-- 项目主代码编译输出目录,默认为target/classes -->
<d>${project.build.outputDirectory}</d>
<!-- 项目测试代码编译输出目录,默认为target/test-classes -->
<e>${project.build.testOutputDirectory}</e>
<!-- 项目的groupId -->
<f>${project.groupId}</f>
<!-- 项目的artifactId -->
<g>${project.artifactId}</g>
<!-- 项目的version,与${version}等价-->
<h>${project.version}</h>
<!-- 项目打包输出文件的名称,默认为${project.artifactId}-${project.version} -->
<i>${project.build.finalName}</i>
<!-- setting属性 -->
<!-- 获取本地仓库地址-->
<a1>${settings.localRepository}</a1>
<!-- 系统属性 -->
<!-- 用户目录 -->
<a2>${user.home}</a2>
<!-- 环境变量属性,获取环境变量JAVA_HOME的值 -->
<a3>${env.JAVA_HOME}</a3>
</properties>
多套环境构建问题
理解资源文件打包过程
resources
目录中的文件一般放的都是配置文件,配置文件一般最好我们都不会写死,所以此处有几个问题:
- 这个插件复制资源文件如何设置编码?
- 复制的过程中是否能够对资源文件进行替换,比如在资源文件中使用一些占位符,然后复制过程中对这些占位符进行替换。
maven-resources-plugin
这个插件也想到了这个功能,帮我们提供了这样的功能
设置资源文件复制过程采用的编码
<properties>
<encoding>UTF-8</encoding>
</properties>
设置资源文件内容动态替换
资源文件中可以通过@maven属性@
来引用maven属性中的值,打包的过程中这些会被替换掉,替换的过程默认是不开启的,需要手动开启配置。
修改src/main/resource/jdbc.properties
内容如下:
jdbc.url=@jdbc.url@
jdbc.username=@jdbc.username@
jdbc.password=@jdbc.password@
在配置文件中引用 pom 中的 properties 变量时,默认使用 @ 来获取
pom.xml 中的配置
<!-- 自义定属性在配置文件 jdbc.properties 中获取 -->
<jdbc.url>jdbc:mysql://localhost:3306/javacode2018?characterEncoding=UTF-8</jdbc.url>
<jdbc.username>root</jdbc.username>
<jdbc.password>root</jdbc.password>
<build> 下 <resources> 标签配置如下
:
<resources>
<resource>
<!-- 指定资源文件的目录 -->
<directory>${project.basedir}/src/main/resources</directory>
<!-- 是否开启过滤替换配置,默认是不开启的 -->
<filtering>true</filtering>
</resource>
</resources>
自定义替换的分隔符
自定义分隔符,需要我们配置maven-resources-plugin插件的参数,如下:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<!-- 是否使用默认的分隔符,默认分隔符是${*}和@ ,这个地方设置为false,表示不启用默认分隔符配置-->
<useDefaultDelimiters>false</useDefaultDelimiters>
<!-- 自定义分隔符 -->
<delimiters>
<delimiter>$*$</delimiter>
<delimiter>##</delimiter>
</delimiters>
</configuration>
</plugin>
</plugins>
delimiters
中可以配置多个delimiter
,可以配置#*#
,其中的*表示属性名称,那么资源文件中的#
属性名#在复制的过程中会被替换掉,*
前后都是#
,表示前后分隔符都一样,那么可以简写为#
,所以#*#
和#
写法是一样的,我们去看一下源码,delimiters的默认值如下:
AbstractMavenFilteringRequest 类
private void initDefaults() {
this.projectStartExpressions.add("pom");
this.projectStartExpressions.add("project");
this.delimiters.add("${*}");
this.delimiters.add("@");
}
maven resources 目标执行
maven 中执行 资源打包操作
mvn resources:resources
maven plugin 插件debug
-
启动debug
mvnDebug -Dplugin=org.apache.maven.plugins:maven-resources-plugin:3.1.0:resources
-
maven plugin debug 启动配置
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
指定需要替换的资源文件
<resource>
<!-- 指定资源文件的目录 -->
<directory>${project.basedir}/src/main/resources</directory>
<!-- 是否开启过滤替换配置,默认是不开启的 -->
<filtering>true</filtering>
<!--需要被处理的文件列表-->
<includes>
<include>**/jdbc.properties</include>
</includes>
<!--排除需要被处理的资源文件列表-->
<excludes>
<exclude>**/const.properties</exclude>
</excludes>
</resource>
上面使用
includes
列出需要被处理的,使用excludes
排除需要被处理的资源文件列表,采用通配符的写法,**
匹配任意深度的文件路径,*
匹配任意个字符。
多个resource元素的使用案例
<resources>
<!-- jdbc.properties 被复制到target下面,但是需要替换里面的内容 -->
<resource>
<!-- 指定资源文件的目录 -->
<directory>${project.basedir}/src/main/resources</directory>
<!-- 是否开启过滤替换配置,默认是不开启的 -->
<filtering>true</filtering>
<includes>
<include>**/jdbc.properties</include>
</includes>
</resource>
<!-- const.propertis只是被复制到target下面,但是不要去替换里面的内容 -->
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>**/const.properties</include>
</includes>
</resource>
</resources>
使用profiles处理多环境构建问题
maven
支持让我们配置多套环境,每套环境中可以指定自己的maven
属性,mvn
命令对模块进行构建的时候可以通过-P
参数来指定具体使用哪个环境的配置.
profiles元素支持定义多套环境的配置信息,配置如下用法:
<profiles>
<profile>测试环境配置信息</profile>
<profile>开发环境配置信息</profile>
<profile>线上环境配置信息</profile>
<profile>环境n配置信息</profile>
</profiles>
profiles
中包含多个profile
元素,每个profile
可以表示一套环境,profile
示例如下:
<profile>
<id>dev</id>
<properties>
<jdbc.url>dev jdbc url</jdbc.url>
<jdbc.username>dev jdbc username</jdbc.username>
<jdbc.password>dev jdbc password</jdbc.password>
</properties>
</profile>
id
:表示这套环境的标识信息,properties
可以定义环境中使用到的属性列表。
执行mvn
命令编译的时候可以带上一个-P profileid
来使用指定的环境进行构建。
指定环境进行构建
执行命令
mvn clean package -Pdev
pom.xml 配置
<profiles>
<!-- 开发环境使用的配置 -->
<profile>
<id>dev</id>
<properties>
<jdbc.url>dev jdbc url</jdbc.url>
<jdbc.username>dev jdbc username</jdbc.username>
<jdbc.password>dev jdbc password</jdbc.password>
</properties>
</profile>
<!-- 测试环境使用的配置 -->
<profile>
<id>test</id>
<properties>
<jdbc.url>test jdbc url</jdbc.url>
<jdbc.username>test jdbc username</jdbc.username>
<jdbc.password>test jdbc password</jdbc.password>
</properties>
</profile>
<!-- 线上环境使用的配置 -->
<profile>
<id>prod</id>
<properties>
<jdbc.url>test jdbc url</jdbc.url>
<jdbc.username>test jdbc username</jdbc.username>
<jdbc.password>test jdbc password</jdbc.password>
</properties>
</profile>
</profiles>
注意上面命令中多了一个
-Pdev
参数,-P
后面跟的是pom.xml
中profile的id
,表示需要使用那套环境进行构建。此时我们使用的是dev
环境,即开发环境。
查看目前有哪些环境
mvn help:all-profiles
查看目前激活的是哪些环境
mvn help:active-profiles
b2b 项目多模块资源打包
mvn clean package -pl :b2b-account-service,:b2b-order-service -Pdev
profile元素更强大的功能
profile
元素可以用于对不同环境的构建进行配置,project
中包含的元素,在profile
元素中基本上都有,所以profile
可以定制更复杂的构建过程,不同的环境依赖的构件、插件、build
过程、测试过程都是不一样的,这些都可以在profile
中进行指定,也就是说不同的环境所有的东西都可以通过profile元素来进行个性化的设置.
参考
多环境构建
maven属性定义与使用
maven占位符的使用
Maven 整合 spring profile实现多环境自动切换
maven占位符官网文档
如何调试 Maven Plugin
maven插件开发官网文档