maven 的resources标签使用
maven 的resources标签使用
- TOC
{:toc}
默认情况下的maven资源配置
此标签用来控制资源的拷贝,maven对资源的控制是使用maven-resources插件完成的。
使用mvn help:effective-pom查看实际使用的配置。resources插件默认会执行testResources 和 resources 两个goal
1 | |
resources插件默认执行上面两个goal,这两个步骤分别对测试资源和正式资源进行拷贝。
从哪里拷贝到哪里是由resources标签决定。默认resources标签是:
1 | |
可以看到默认目标分别是src/main/resources 和 src/test/resources , 而输出目标分别是target/classes 和target/test-classes。
也可以使用变量代替:${project.build.outputDirectory} 表示默认的输出目录,即target目录。${project.basedir} 表示项目目录,即pom文件所在的目录(会与target同级)
定制Resources标签
我们自定义resources标签可以覆盖超级pom的默认配置。下面只讲解resources标签,testResources标签是同理的。
这个标签写在build标签下,用来配置resources插件工作
1 | |
directory
表示原资源路径,请填写相对路径,相对于pom所在的目录,即如果
pom.xml在d:project文件夹下,默认的相对路径为d:project/,拼在一起就变成d:project/src/main/resources,所以这里填写路径不要以/开头,否则会变成绝对路径。这个选项是必填的。
targetPath
资源拷贝的目标地址,这个路径是选填的。默认输出路径为
target/classes/,如此处填写abc,则会将
src/main/resources下的文件拷贝到target/classes/abc文件夹下。不写就是拷贝到target/classes/。includes 和 excludes
maven默认会将
directory下的文件全部拷贝到targetPath下,但是受这两个属性控制。如果存在
includes则只将includes指定的文件拷贝,其余不拷贝。如果在
excludes则将排除掉指定文件外的剩余文件拷贝。如果同时存在,则按照先后顺序过滤。
例如先存在
includes,后存在excludes,则先使用includes筛选出满足条件的文件,再使用excludes对上面筛选出来的文件进行二次筛选。如果同时存在,且同时操作同一个文件,则以excludes为准。
因为无论excludes在前还是在后,都会将文件过滤掉,所以同一个文件来说一定会被过滤掉。
上面的四个规则是对于同一个
resource标签内的includes、excludes来讲的,不是同一个resource标签互相不影响。例如下面的例子使用一个
resource过滤掉所有的application*.properties,再使用另一个
resource添加进来。
有时使用单个
resource标签可能无法完成想要的行为,可以多个resource组合使用如想要
resources文件夹下的application*.properties文件,根据配置选择打包哪个,可以这样写。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<resources>
//这个resource排除掉所有application*.properties
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application*.properties</exclude>
</excludes>
</resource>
//这个resource添加了application.properties 和 application-${profile.active}.properties
<resource>
<directory>src/main/resources</directory>
<includes>
<include>application.properties</include>
<include>application-${profile.active}.properties</include>
</includes>
</resource>
</resources>filtering
这个选项可以是true或 false,表示是否对资源进行过滤,也就是说,可以在配置文件里写一些动态的值,maven会将值替换成真正的值,设成false则不会过滤。
比如下面
properties文件中的一条记录,maven编译完成后值会被替换成profile.active这个变量代表的值。1
spring.profiles.active= @profile.active@
总结
需要注意的一点是,如果在自己的pom里配置的resource标签,超级父pom里的resource就会失效了,比如下面这样配置后,只会拷贝src/main/myImage里的内容,默认的src/main/resources内的内容就不会被拷贝了。
1 | |
可以再添加一个,两个resource共同配置即可。
1 | |