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进行填充。

  • 实例
  1. test.properties属性文件
pool.driverClassName=com.mysql.jdbc.Driver
pool.url=jdbc:mysql://192.168.100.23:3306/etmis
pool.username=root
pool.password=123456
  1. 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/resourcessrc/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>
  • 解析
  1. resources:资源元素列表包含标签
  • targetPath:指定资源文件编译后(复制后)放置的目录,根目录是target/classes,如果设置了<targetPath>,会在target/ckasses文件下拼接新的文件夹名
  • filtering:指定是否使用filter进行填充,上面有介绍。
  • directory:指明资源文件在哪个位置
  • include:指明资源文件位置下的什么文件需要编译
  • exclude:指定忽略什么文件。
  1. testResources:test测试阶段的内容
    与上面的差不多,第一个子标签是testResource