maven的pom.xml中resources

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>

版权声明:本文为gaoyipingzgh000原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。