maven的pom.xml中resources
在开发maven项目时,一般都会把配置文件放到src/main/resources目录下,针对这个目录,maven的resources对其进行单独的配置。
resources配置一般如下:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>jdbc.properties</include>
<include>logback-spring.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>jdbc.properties</exclude>
<exclude>logback-spring.xml</exclude>
</excludes>
</resource>
</resources>
第一个resource配置是指:在src/main/resources目录下,仅jdbc.properties和logback-spring.xml两个文件是资源文件,而且这两个文件需要被过滤,即会对占位符${key}或@xx@进行替换。
第二个resource配置是指:同样在src/main/resources目录下,除jdbc.properties和logback-spring.xml两个文件外的其他文件也是资源文件,但是它们不会被过滤,也就不会用真实值来填写${key}或@xx@这样的配置。
如果只配置第一个resource,那么maven打包后,工程的classpath下只有jdbc.properties和logback-spring.xml两个文件,其他配置文件没有打包进来。所以第二个resource是必不可少的,指明其他配置文件是不需要过滤的,但是同样需要打包到classpath下。
若filtering、include和exclude都不配置,就是把directory下的所有配置文件都放到classpath下。
directory
指定资源文件的位置。
filtering
filetering是一个boolean变量,作用是将资源文件中的占位符替换成对应的值。
filtering为true,开启过滤,替换directory下的文件中的参数(eg. ${name})。会把过滤的文件打到classpath下
filtering为false,不过滤,不会进行占位符替换。会把不需要过滤的文件打到classpath下
默认情况下 filtering 为 false ,所以需要重写默认设置。
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
SpringEL表达式取值一般是${name}方式取值, 见于application.properties和@Value("${var}")中。适用于配置文件及代码中的注解
maven的pom.xml文件中也有类似的取值表达式, 也是通过${var}的方式取值。适用于pom.xml文件中
示例:如果不做filtering配置,pom中的${env}是可以被解析替换的。但是resource指定的资源文件application.properties中的@env@是不会被解析替换的
## pom.xml
<resource>
<directory>src/main/resources</directory>
<includes>
<include>application-${env}.properties</include>
</includes>
</resource>
## application.properties
env=@env@
如果想使用maven中的配置,就需要resource指定一个范围,并且指定filtering=true.然后Spring的范围内能就能取到maven的配置参数了
include与exclude
<include>与<exclude>是用来圈定和排除某一文件目录下的文件是否是工程资源的。如果<include>与<exclude>划定的范围存在冲突时,以<exclude>划定的范围为准。大多数情况下,人们使用<include>和<exclude>是为了配合<filtering>实现过滤特定文件的需要。例如,在一个工程中,src/main/resources目录下都是工程的资源文件,并不需要<include>和<exclude>再进行划定。
<include>指明需要包括的资源,位于src/main/resources中的任何txt和rtf文件(包括子目录)都会被处理
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.txt</include>
<include>**/*.rtf</include>
</includes>
</resource>
<exclude>指代不需要处理的资源,仅处理src/main/resources资源目录中除bmp, jpg. jpeg, gif之外的资源
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.bmp</exclude>
<exclude>**/*.jpg</exclude>
<exclude>**/*.jpeg</exclude>
<exclude>**/*.gif</exclude>
</excludes>
</resource>
同时使用<include>和<exclude>处理所有的名字中不带有test的txt文件
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.txt</include>
</includes>
<excludes>
<exclude>**/*test*.*</exclude>
</excludes>
</resource>
include与exclude的关系
1、同一个resource下,如果include和exclude都存在,且文件存在冲突的话,冲突的文件会以exclude为准。
下面示例中,只会将jdbc.properties打包
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>jdbc.properties</include>
<include>logback-spring.xml</include>
</includes>
<excludes>
<exclude>logback-spring.xml</exclude>
</excludes>
</resource>
</resources>
2、不同resource,filtering相同,如果include和exclude都存在,且文件存在冲突的话,冲突的文件以include为准。
下面示例中,第二个resource中的四个资源文件都会被打包,filtering都为true则占位符被替换,filtering都为false则占位符没有替换
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>*.xml</include>
<include>*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>application-daily.properties</exclude>
<exclude>application-prepub.properties</exclude>
<exclude>application-publish.properties</exclude>
<exclude>logback-spring.xml</exclude>
</excludes>
</resource>
</resources>
3、不同resource,filtering也不相同,如果include和exclude都存在,且文件存在冲突的话,冲突的文件是否被打包以include为准,是否被过滤以filtering为ture的include或exclude为准
下面示例中,第二个resource中的四个资源文件都会被打包,且以第一个resource中filtering=true的includes为准进行资源文件的占位符替换,即所有的.xml和.properties文件都会被过滤
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>*.xml</include>
<include>*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>application-daily.properties</exclude>
<exclude>application-prepub.properties</exclude>
<exclude>application-publish.properties</exclude>
<exclude>logback-spring.xml</exclude>
</excludes>
</resource>
</resources>
下面示例中,第二个resource中的四个资源文件都会被打包,且以第二个resource中filtering=true的excludes为准进行资源文件的占位符替换,即exclude中的四个文件不被过滤,其他的.xml和.properties文件都会被过滤
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>*.xml</include>
<include>*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>application-daily.properties</exclude>
<exclude>application-prepub.properties</exclude>
<exclude>application-publish.properties</exclude>
<exclude>logback-spring.xml</exclude>
</excludes>
</resource>
</resources>
include和exclude里filtering总结:
filtering为true:
include:替换指定文件中@xx@表示的maven properties属性值
exclude:替换指定文件以外@xx@表示的maven properties属性值
filtering为false:
include:不替换指定文件中@xx@表示的maven properties属性值
exclude:不替换指定文件以外@xx@表示的maven properties属性值
其他说明
*与**/*意义不同,*指resource路径下,并不包含resource子文件夹下的文件, **/*指resource路径及其子路径下所有文件。
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*</include>
<include>**/*</include>
<include>*.xml</include>
<include>**/*.xml</include> <!-- src/main/resources下的所有xml文件 -->
<include>**.*</include> <!-- ??? -->
<include>**/*.*</include> <!-- src/main/resources文件夹以及子文件夹下所有资源文件 -->
<include>**/*/*.*</include> <!-- ??? -->
</includes>
</resource>
</resources>
如果某些资源文件如.pem .pfx .so不能被过滤,则可以通过maven-resources-plugin配置后缀的方式进行处理:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<!-- 过滤后缀为pem、pfx的证书文件 -->
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pem</nonFilteredFileExtension>
<nonFilteredFileExtension>pfx</nonFilteredFileExtension>
<nonFilteredFileExtension>so</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>