resources 插件,负责将配置文件复制到编译目录中。Maven Java Web 项目默认的编译目录 target/classes

两种配置文件 src/main/resources、src/test/resources,Maven 默认只关注 src/main/resources 目录下的配置文件,其他目录下的配置文件会被忽略。

在这里插入图片描述

指定配置文件所在的目录

如果有配置文件不在 resources 目录下,这个时候就需要指定配置文件所在的目录:

<build>
	<!--指定属性文件,里面含有键值对-->
	<filters>    
		<filter>${user.home}/antx.properties</filter> 
	</filters> 
  	<resources>
    <resource>
    <!--指定配置文件所在的目录-->
      <directory>
        src/main/java
      </directory>
      <!--启用上面的过滤文件-->
      <filtering>true</filtering> 
    </resource>
  	</resources>
</build>

使用 excludes 元素可以排除指定的配置文件

<resources>
  <resource>
    <directory>
      src/main/java
    </directory>
    <!--排除所有的txt文件,其他的文件都会被复制-->
    <excludes>
      <exclude>**/*.txt</exclude>
    </excludes>
  </resource>
</resources>

使用 includes 元素可以指定要处理的文件

<resources>
  <resource>
    <directory>
      src/main/java
    </directory>
    <!--除了txt文件,其他的文件都不会被复制-->
    <includes>
      <include>**/*.txt</include>
    </includes>
  </resource>
</resources>

处理测试资源

处理测试资源,其实就是默认处理 src/test/resources 下的资源,需要在 pom.xml 中配置如下:

 <build>
        <filters>
            <filter>
                src/main/resources/${fileName}.properties
            </filter>
        </filters>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <testResources>
            <testResource>
            	<!--指定测试资源的存放目录-->
                <directory>src/test/resources</directory>
            </testResource>
        </testResources>
</build>

打开命令终端,切换到 pom.xml 文件所在的目录下,执行下面的指令:

[~/documents/IdeaProjects/demo02]$ mvn resources:testResources
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------------< com.example:demo02 >-------------------------
[INFO] Building demo02 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-cli) @ demo02 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.893 s
[INFO] Finished at: 2022-01-26T20:43:22+08:00
[INFO] ------------------------------------------------------------------------

我们再看看 target 目录下有什么内容:

[~/documents/IdeaProjects/demo02]$ ls target
test-classes

如上查询结果可知,执行 mvn resources:testResources 会产生一个 test-classes 目录,src/test/resources 目录下的资源文件会复制到 test-classes 目录下。

过滤器配置

~/test.properties 文件中的内容:

name=liaowenxiong

src/main/java/test.txt 配置文件中的内容如下:

您好 ${name}

${属性名/变量名},表示获取对应属性/变量的值。

pom.xml 配置过滤文件,资源中启用过滤器:

<build>
    <filters>
        <!-- 指定过滤器文件,其实就是个属性文件,里面含有键值对 -->
        <filter>
            ${user.home}/test.properties
        </filter>
    </filters>
    <resources>
        <resource>
            <!--指定配置文件所在的目录-->
            <directory>
                src/main/java
            </directory>
            <!--启用上面的过滤文件-->
            <filtering>
                true
            </filtering>
        </resource>
    </resources>
</build>

执行下面的命令处理资源文件:

[~/documents/IdeaProjects/demo02]$ mvn resources:resources
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------------< com.example:demo02 >-------------------------
[INFO] Building demo02 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-cli) @ demo02 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.976 s
[INFO] Finished at: 2022-01-26T18:31:29+08:00
[INFO] ------------------------------------------------------------------------

执行上述的命令之后,Maven 会将指定目录下的资源文件复制到编译输出目录(target/classes)下,并且资源文件 src/main/java/test.txt 中的 ${name} 会替换成过滤文件中的对应属性的值,过滤文件中含有属性 name,其值为 liaowenxiong,所以就将 ${name} 替换成 liaowenxiong,因此进入 target/classes 目录下,打开 test.txt 文件,会看到以下的内容:

您好 liaowenxiong

举个典型的应用场景:
开发环境和测试环境的数据库连接参数不同,你可以创建两份文件数据库参数文件(properties 文件),然后再创建一份真正需要代码解析的数据库配置文件(properties 文件或者 xml 文件)。

开发环境下的数据库参数文件 db1.properties 内容如下:

url=jdbc:mysql://192.168.200.123:3306/dev
username=root
password=123

测试环境下的数据库参数文件 db2.properties 的内容如下:

url=jdbc:mysql://192.168.200.124:3306/test
username=root
password=456

数据库配置文件 db.properties 的内容如下:

driverClassName=com.mysql.jdbc.Driver
# 如果是数据库在本地,且端口号是3306,则可以简写成:jdbc:mysql:///test
url=${url}
userName=${userName}
password=${password}
# 连接池初始化时会生成5个连接对象
initialSize=5
maxActive=10
maxWait=3000

我把三份属性文件都放在 src/main/resources 目录下,如下图所示:
在这里插入图片描述
pom.xml 配置内容如下:

<build>
        <filters>
        	<!--指定过滤文件,文件名使用变量的值替换-->
            <filter>
                src/main/resources/${fileName}.properties
            </filter>
        </filters>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <!--启用过滤器-->
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

打开命令终端,切换到 pom.xml 所在的目录下,执行下面的命令:

[~/documents/IdeaProjects/demo02]$ mvn resources:resources -DfileName=db1
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------------< com.example:demo02 >-------------------------
[INFO] Building demo02 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-cli) @ demo02 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.948 s
[INFO] Finished at: 2022-01-26T20:25:49+08:00
[INFO] ------------------------------------------------------------------------

在命令终端查看生成的数据库配置 db.properties 文件:

[~/documents/IdeaProjects/demo02]$ cat target/classes/db.properties
driverClassName=com.mysql.jdbc.Driver
# 如果是数据库在本地,且端口号是3306,则可以简写成:jdbc:mysql:///test
url=jdbc:mysql://192.168.200.123:3306/dev
userName=root
password=123
# 连接池初始化时会生成5个连接对象
initialSize=5
maxActive=10
maxWait=3000

上述可以看到,属性 url、userName、password 的值全部替换成 db1.properties 文件中对应属性的值。

执行 mvn resources:resources时,如果指定变量 fileName=db2,看看效果如何:

[~/documents/IdeaProjects/demo02]$ mvn resources:resources -DfileName=db2
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------------< com.example:demo02 >-------------------------
[INFO] Building demo02 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-cli) @ demo02 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.950 s
[INFO] Finished at: 2022-01-26T20:31:05+08:00
[INFO] ------------------------------------------------------------------------

在命令终端查看生成的数据库配置 db.properties 文件:

[~/documents/IdeaProjects/demo02]$ cat target/classes/db.properties      
driverClassName=com.mysql.jdbc.Driver
# 如果是数据库在本地,且端口号是3306,则可以简写成:jdbc:mysql:///test
url=jdbc:mysql://192.168.200.124:3306/test
userName=root
password=456
# 连接池初始化时会生成5个连接对象
initialSize=5
maxActive=10
maxWait=3000                                                                                                                                                                                       

上述可以看到,属性 url、userName、password 的值全部替换成 db2.properties 文件中对应属性的值。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐