maven的resources默认使用的插件是maven-resources-plugin,主要是用于执行资源文件拷贝。
我们先看一个示例,然后在一一介绍。
<build>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<excludes>
<exclude>config/**exclude>
excludes>
<filtering>truefiltering>
resource>
<resource>
<directory>src/main/resources/config/${pkg.env}directory>
<includes>
<include>config.mybatis.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
resources>
build>
directory目录是指定资源文件位置,默认是src/main/resources目录,一般我们不配置这个,默认就是把src/main/resources目录下的所有文件都拷贝。
exclude的是排除文件、目录。
<resource>
<directory>src/main/resourcesdirectory>
<excludes>
<exclude>config/**exclude>
excludes>
<filtering>truefiltering>
resource>
例如我们把不同环境的配置文件都放在config目录下,打包的时候按需拷贝。
因为默认会拷贝src/main/resources下的所有目录和文件,所有只需要配置exclude:config/**,表示排除config目录及其子目录及文件。
filtering是用参数替换占位符的过程,必须和filters一起使用。
<build>
<filters>
<filter>src/main/resources/config/dev/application-dev.propertiesfilter>
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>devid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<build>
<filters>
<filter>src/main/resources/config/dev/application-dev.propertiesfilter>
filters>
build>
profile>
<profile>
<id>proid>
<build>
<filters>
<filter>src/main/resources/config/pro/application-pro.propertiesfilter>
filters>
build>
profile>
profiles>
如果像mybatis的配置文件,里面有大量properties,我们也通过filtering来替换吗?
显然,这样不太合适。这个时候,我们可以直接拷贝文件。
<resource>
<directory>src/main/resources/config/${pkg.env}directory>
<includes>
<include>config.mybatis.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
directory配置到指定目录,表示要从这个目录拷贝文件。include表示要拷贝的文件,因为不是src/main/resources目录,所以,只会拷贝include配置的文件。
${pkg.env}配置在profile的properties中,这样,就可以拷贝指定环境的文件。
<profiles>
<profile>
<id>devid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<properties>
<pkg.env>devpkg.env>
properties>
profile>
<profile>
<id>proid>
<properties>
<pkg.env>propkg.env>
properties>
profile>
profiles>
include-exclue
filter
resource插件示例