Maven 配置文件详细解析(待完成)
一、INDEX
在开发中经常遇到Maven配置文件看不懂,不清楚如何配置的情况,担心以后生产中需要自己配置,防患于未然,从网上寻找资料,结合自己理解,补足短板。
二、Profile,Resource, Filter区分部署环境
本段落节选自
开发项目需要部署多种环境,需要维持多套配置文件。
可以在POM和Settings中进行配置profiles此点存疑,区别是POM针对单体项目,settings是全局配置。
- 配置profiles标签
<!-- 区分环境打包 -->
<profiles>
<!-- 开发环境[默认] -->
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<!-- 默认激活 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<!-- 线上环境 -->
<profile>
<id>product</id>
<properties>
<env>product</env>
</properties>
</profile>
</profiles>
配置完成profiles之后,指定了运行的环境,下一步需要指定该环境对应的配置文件。利用<filter>
标签。
- 配置filter标签
<filters>
<filter>src/main/resources/${env}.properties</filter>
</filters>
这个${env}
就是上面<env>
标签中的内容,因为默认激活了test,所以这里就是test。
配置好了properties配置文件,下一步就是开关,即供开发者选择,是否使用这个filter给的配置文件。
- 配置开关,标签
<!-- 指定资源文件目录 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 设置为true,则init.properties会根据${env}.properties里面的配置来填充 -->
<filtering>true</filtering>
<includes>
<include>*.xml</include>
<include>init.properties</include>
</includes>
</resource>
</resources>
<filtering>true</filtering>
意思是,是否用<filter>
指定的properties配置文件,匹配<include>
标签中的init.properties文件。
Resources标签,即需要打包进jar/war的内容,如果不写这个标签,可能会出现target中缺少部分文件。上面的代码,至少保证了,在src/main/resources
下的所有的xml文件和init.propertiers都被放到了target中。同时init.properties被${env}.properties
进行填充。
- 实例
- test.properties属性文件
pool.driverClassName=com.mysql.jdbc.Driver
pool.url=jdbc:mysql://192.168.100.23:3306/etmis
pool.username=root
pool.password=123456
- init.properties
pool.driverClassName=${pool.driverClassName}
pool.url=${pool.url}
pool.username=${pool.username}
pool.password=${pool.password}
pool.maxWait=${pool.maxWait}
# env的属性在这里也有效
env=${env}
- 匹配后:
pool.driverClassName=com.mysql.jdbc.Driver
pool.url=jdbc:mysql://192.168.100.23:3306/etmis
pool.username=root
pool.password=123456
pool.maxWait=${pool.maxWait}
# env的属性在这里也有效
env=test
- 手动指定环境命令
mvn package -DskipTests -P test
根据-P 后面的内容,对应 中的,
找到对应的之后,拿到标签中的内容,用这个内容去匹配${env}.properties,这是分两步走的,不是一步到位。
三、Resources标签详细解析
本段落节选自https://www.jianshu.com/p/40f48f2515b3
src/main/java
文件夹和src/test/java
文件夹内的.java
文件可以被正常编译,配合Maven可以将编译后的class文件进行打包。但是这两个文件夹内的.xml
等其他的资源文件就不这么智能了,不能被编译到target内。
资源文件如果放到src/main/resources
和src/test/resources
中,文件会被赋值到target/classes文件夹和target/test-classes文件夹中。
打包时,只会将target/classes文件夹中所有的内容打包到jar包或者war包中。
如果想让java文件夹中的资源文件,被复制到target中,需要使用到<resources>
标签。
- 代码实例
<resources>
<resource>
<targetPath>/subTarget</targetPath>
<filtering>true</filtering>
<directory>${basedir}/src/main/sourceDir</directory>
<includes>
<include>sourceName.xml</include>
</includes>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
</resources>
<testResources>
</testResources>
- 解析
- resources:资源元素列表包含标签
- targetPath:指定资源文件编译后(复制后)放置的目录,根目录是target/classes,如果设置了
<targetPath>
,会在target/ckasses文件下拼接新的文件夹名 - filtering:指定是否使用filter进行填充,上面有介绍。
- directory:指明资源文件在哪个位置
- include:指明资源文件位置下的什么文件需要编译
- exclude:指定忽略什么文件。
- testResources:test测试阶段的内容
与上面的差不多,第一个子标签是testResource