maven 的resources标签使用

Posted by hcy on September 26, 2019

maven 的resources标签使用

默认情况下的maven资源配置

​ 此标签用来控制资源的拷贝,maven对资源的控制是使用maven-resources插件完成的。

使用mvn help:effective-pom查看实际使用的配置。resources插件默认会执行testResourcesresources 两个goal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <executions>
      <execution>
        <id>default-testResources</id>
        <phase>process-test-resources</phase>
        <goals>
          <goal>testResources</goal>
        </goals>
      </execution>
      <execution>
        <id>default-resources</id>
        <phase>process-resources</phase>
        <goals>
          <goal>resources</goal>
        </goals>
      </execution>
    </executions>
</plugin>

​ resources插件默认执行上面两个goal,这两个步骤分别对测试资源和正式资源进行拷贝。

从哪里拷贝到哪里是由resources标签决定。默认resources标签是:

1
2
3
4
5
6
7
8
9
10
11
12
13
<outputDirectory>C:/ijtest/testmaven/target/classes</outputDirectory>
<testOutputDirectory>C:/ijtest/testmaven/target/test-classes</testOutputDirectory>

<resources>
  <resource>
    <directory>C:/ijtest/testmaven/src/main/resources</directory>
  </resource>
</resources>
<testResources>
  <testResource>
    <directory>C:/ijtest/testmaven/src/test/resources</directory>
  </testResource>
</testResources>

​ 可以看到默认目标分别是src/main/resourcessrc/test/resources , 而输出目标分别是target/classestarget/test-classes

也可以使用变量代替: ${project.build.outputDirectory} 表示默认的输出目录,即target目录。 ${project.basedir} 表示项目目录,即pom文件所在的目录(会与target同级)

定制Resources标签

​ 我们自定义resources标签可以覆盖超级pom的默认配置。下面只讲解resources标签,testResources标签是同理的。

这个标签写在build标签下,用来配置resources插件工作

1
2
3
4
5
6
7
8
9
10
11
12
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>abc</targetPath>
            <includes>
                <include>application.*</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
  • directory

    ​ 表示原资源路径,请填写相对路径,相对于pom所在的目录,即如果pom.xmld: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
2
3
4
5
<resources>
  <resource>
    <directory>src/main/myImage</directory>
  </resource>
</resources>

​ 可以再添加一个,两个resource共同配置即可。

1
2
3
4
5
6
<resource>
    <directory>src/main/myImage</directory>
</resource>
<resource>
    <directory>src/main/resources</directory>
</resource>

转载请注明出处:https://www.huangchaoyu.com/2019/09/26/maven-的resources标签使用/