Apache Maven Resources Plugin是Apache Maven团队提供的官方核心插件,能够将Maven项目中的各种资源文件复制到指定的输出目录中。
1. 在Maven项目中的资源可以分为两类
- main资源,指位于src/main/resources路径下的资源文件
- test资源,指位于src/test/resources路径下的资源文件
2. Apache Maven Resources Plugin提供的Goals
1) resources:resources
将main资源文件复制到输出目录,默认已经加入到Maven的process-resources生命周期阶段。
- <project><build><resources>指定要复制的main资源文件,默认位于src/main/resources路径
- <project><build><outputDirectory>指定main资源的输出目录,默认位于target/classes/路径
2) resources:testResources
将test资源文件复制到输出目录,默认已经加入到Maven的process-test-resources生命周期阶段。
- <project><build><testResources>指定要复制的test资源文件,默认位于src/test/resources路径
- <project><build><testOutputDirectory>指定test资源的输出目录,默认位于target/test-classes/路径
3) resources:copy-resources
对于非main资源或非test资源,又没有在pom.xml的<build><resources>...</build></resources>配置的资源,在构建过程中不会输出到项目的target/classes/目录下。
这时,可以通过maven-resources-plugin的<configure>给出要复制的任何资源,并给出target下的输出目录,示例如下:
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- bind to a phase, required -->
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/extra-resources</outputDirectory>
<resources>
<resource>
<directory>src/non-packaged-resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/non-packaged-testresources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
3. 示例
1) 示例1,为资源文件配置encoding编码
通常,在<properties>中为整个项目设置全局的encoding编码,如下:
<project ...>
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
...
</properties>
...
对于有的资源文件,如果不使用项目的全局encoding编码,则可以设置如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
...
<encoding>UTF-8</encoding>
...
</configuration>
</plugin>
...
2) 示例2,配置非src/main/resources路径下的资源文件
<build>
<resources>
<resource>
<directory>src/resource2</directory>
</resource>
...
</resources>
...
对于指定路径,还可以进一步指定include/exclude的文件
<build>
<resources>
<resource>
<directory>src/resource2</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.yaml</include>
</includes>
</resource>
...
</resources>
...
<build>
<resources>
<resource>
<directory>src/resource2</directory>
<excludes>
<exclude>**/*.rtf</exclude>
<exclude>**/*.txt</exclude>
</excludes>
</resource>
...
</resources>
...
<build>
<resources>
<resource>
<directory>src/my-resources</directory>
<includes>
<include>**/*.txt</include>
</includes>
<excludes>
<exclude>**/*test*.*</exclude>
</excludes>
...
</resource>
...
3) 示例3,替换资源文件中的占位符变量
对于Maven标准的占位符变量,如${project.groupId},${project.artifactId},${project.version},${project.basedir}等,只要在配置<resource>的时候,设置<filtering>true</filtering>即可,如下:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.txt</include>
</includes>
<excludes>
<exclude>**/*test*.*</exclude>
</excludes>
<filtering>true</filtering>
</resource>
这样,执行mvn resources:resources即可。
或者,执行mvn resources:resources -Dname="world",直接给出${name}变量的值。
对于非Maven标准的占位符变量,简单的情况下,直接在<project><properties>...</properties></project>声明,如下:
<project>
...
<properties>
<your.name>world</your.name>
...
</properties>
在<resources><resource>...</resource></resources>的文件中引用${your.name}即可。
如果有大量的占位符变量,可以在单独的filter属性配置文件中声明变量,在pom.xml文件中统一过滤,步骤如下:
- 将要过滤的文件置于独立的路径src/main/resources-filtered
- 创建文件my-filter-values.properties
your.name = world
- 配置pom.xml文件
<build>
...
<filters>
<filter>my-filter-values.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources-filtered</directory>
<filtering>true</filtering>
</resource>
...
4) 示例4,禁止对某些资源文件进行任何替代(如图片文件进行过滤将导致文件被破坏)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
...
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
<nonFilteredFileExtension>swf</nonFilteredFileExtension>
</nonFilteredFileExtensions>
...
参考链接:
https://maven.apache.org/plugins/maven-resources-plugin/index.html