1. resources简介
maven的resources默认使用的插件是maven-resources-plugin,主要是用于执行资源文件拷贝。
我们先看一个示例,然后在一一介绍。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>config/**</exclude>
</excludes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources/config/${pkg.env}</directory>
<includes>
<include>config.mybatis.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
2. directory
directory目录是指定资源文件位置,默认是src/main/resources目录,一般我们不配置这个,默认就是把src/main/resources目录下的所有文件都拷贝。
3. exclude
exclude的是排除文件、目录。
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>config/**</exclude>
</excludes>
<filtering>true</filtering>
</resource>
例如我们把不同环境的配置文件都放在config目录下,打包的时候按需拷贝。
因为默认会拷贝src/main/resources下的所有目录和文件,所有只需要配置exclude:config/**,表示排除config目录及其子目录及文件。
5. filtering
filtering是用参数替换占位符的过程,必须和filters一起使用。
<build>
<filters>
<filter>src/main/resources/config/dev/application-dev.properties</filter>
</filters>
</build>
什么意思呢?例如:
application.properties文件中有一个配置项
jdbc.url=${dev.jdbc.url}
filter文件application-dev.properties也有相同配置项:
dev.jdbc.url=jdbc:mysql://127.0.0.1:3306/test
拷贝文件application.properties时,如果filtering为true
application.properties文件中的${dev.jdbc.url}占位符就会被替换,变为:
jdbc.url=jdbc:mysql://127.0.0.1:3306/test
注意:
如果使用SpringBoot,应该把${dev.jdbc.url}替换为@dev.jdbc.url@
通常,filtering会和profile配合一起使用,不同环境激活不同的配置文件,从而实现配置分离。
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>src/main/resources/config/dev/application-dev.properties</filter>
</filters>
</build>
</profile>
<profile>
<id>pro</id>
<build>
<filters>
<filter>src/main/resources/config/pro/application-pro.properties</filter>
</filters>
</build>
</profile>
</profiles>
6. include
如果像mybatis的配置文件,里面有大量properties,我们也通过filtering来替换吗?
显然,这样不太合适。这个时候,我们可以直接拷贝文件。
<resource>
<directory>src/main/resources/config/${pkg.env}</directory>
<includes>
<include>config.mybatis.xml</include>
</includes>
<filtering>false</filtering>
</resource>
directory配置到指定目录,表示要从这个目录拷贝文件。include表示要拷贝的文件,因为不是src/main/resources目录,所以,只会拷贝include配置的文件。
${pkg.env}配置在profile的properties中,这样,就可以拷贝指定环境的文件。
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<pkg.env>dev</pkg.env>
</properties>
</profile>
<profile>
<id>pro</id>
<properties>
<pkg.env>pro</pkg.env>
</properties>
</profile>
</profiles>