应用的资源文件不是源代码,一般用来给应用提供熟悉配置等功能。Maven中的资源文件默认存在于src/main/resources、src/test/resources中。项目在打包的时候怎么把资源文件编译、打包呢,主要用到了maven的一个插件:maven-resources-plugin。
三个目标(goal)
maven-resources-plugin有三个goal:
- resources:resources:用来将目录中的资源文件src/main/resources拷贝到编译目录${project.build.outputDirectory}。这个目标默认绑定到了Maven的process-resources阶段,所以process-resources阶段被执行,这个目标就会自动触发。
- resources:testResources:用来将目录中的资源文件src/test/resources拷贝到编译目录${project.build.testOutputDirectory}。这个目标默认绑定到了Maven的process-test-resources阶段,所以process-test-resources阶段被执行,这个目标就会自动触发。
- resources:copy-resources:用来将指定目录中的资源文件拷贝到指定目录,注意需要自己设置资源文件目录和目标目录。
对resources插件的配置
如果默认的情况不能满足我们的需求,比如说资源文件中使用了占位符${},需要由属性文件替换。那就需要我们进行相关的配置,有两个地方需要进行配置:
- <build />下
- 在maven-resources-plugin插件下
1、<build />下
<filters>
<filter>src/main/filters/dev.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>*.properties</exclude>
</excludes>
</resource>
<resource>
<directory>${basedir}/${environment.dir}</directory>
<includes>
<include>${environment}.properties</include>
</includes>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
<includes>
<include>*.properties</include>
</includes>
</testResource>
</testResources>
<build/>下面配置的是全局信息,其下配置的解释:
- <filters />表示用来进行属性替换的属性文件路径。属性文件是用来替换资源文件中的变量的,比如属性文件中有个个键值对”key1=val1“,那么在资源文件中有个”${key1}“,就会被替换为”val1“(假设资源文件开启了filter),默认路径为”${basedir}/src/main/filters“
- <resources />配置main的资源信息
- <directory/>配置资源文件的原始目录
- <filtering/>表示是否开启过滤,过滤的意思就是用属性文件来替换资源文件中的变量
- <includes/>表示包含哪些文件
- <excludes/>表示去除哪些文件
- <testResources />配置test的资源信息
2、maven-resources-plugin下
在插件下的配置在标签<configuration/>下,和全局使用方式一样,这里列举几个官网的例子:
2.1、设置字符集
a、指定project.build.sourceEncoding属性,maven-resources-plugin会自动使用这个属性作为字符集
<project ...>
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
...
</properties>
..
</project>
b、在maven-resources-plugin插件里自己设置
<project>
...
<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>
</plugins>
...
</build>
...
</project>
2.2、设置资源文件目录
maven里默认的资源文件路径是src/main/resources
<project>
...
<build>
...
<resources>
<resource>
<directory>[your folder here]</directory>
</resource>
</resources>
...
</build>
...
</project>
2.3、拷贝资源到其他文件
使用copy-resources这个目标,可以将这个目标绑定到某个阶段上
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- 绑定到某个阶段上 -->
<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>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
...
</project>
2.4、以后缀过滤文件
除了可以使用<excludes/>去除某些文件外,还可以
<project>
...
<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>
...
</configuration>
</plugin>
</plugins>
...
</build>
...
</project>