maven中filtering的使用,打包时排除资源目录,以及SpringBoot下失效的一种情况处理

第一种用法

SpringEL表达式取值一般是${var}方式取值, 见于application.properties和@Value("${var}")中

maven的pom.xml文件中也有类似的取值表达式, 也是通过${var}的方式取值

然而: 它们并不是一个东西!

EL表达式适用于配置文件及代码中的注解

maven的占位符取值表达式默认仅仅适用于pom.xml文件中

我们的需求大多是想打通二者的交流,如何做?

此时filtering就派上用场了

maven的占位符解析表达式的使用场合默认只在pom文件范围内活动

如果想扩大它的活动范围,就必须指定需要扩大到哪些文件,然后指定filtering=true.然后maven的占位符解析表达式就可以用于它里面的表达式解析了.

<build>
    <resources>
        <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

如果你的项目继承了spring-boot-starter-parent,filtering大概率无效

 扫VX 领Java资料,前端,测试,python等等资料都有

filtering无效的原因是,pom.xml继承了spring boot的依赖

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>

点开这个依赖的pom.xml,我们发现,spring boot把默认的占位符号${}改成了@

那么如果想在application.properties中使用maven的占位符以获取maven的参数,此时就不能用${},因为可能会与EL表达式冲突。解决方法如下:

  1. 此时parent依赖将maven占位符表达式默认改为@var@的形式. 所以只能用@var@替代${var}
  2. 在pom.xml里面添加如下内容
<properties>
	<resource.delimiter>${}</resource.delimiter>
</properties>
  1. application.properties里面不用${},改成@ 例如:
jdbc.driverClassName=@jdbc.driverClassName@
   jdbc.url=@jdbc.url@
   jdbc.username=@jdbc.username@
   jdbc.password=@jdbc.password@

第二种用法

在springboot中整合了Vue.js。

我把Vue.js 的前端项目放在了resources/webapp目录下,当Vue.js build出结果到resources/statics下以后,这个webapp作为源码目录是不应该被打包到最后部署的jar包中的。于是想把这个resource/webapp目录给屏蔽掉。因为一直保持着最小改动的原则,这里的方法我也没有具体的测试,因为它不仅增加了一个打包插件,而且还对springboot自带的打包插件增加了设置。
文章开头提到的这种基于resources标签的方法非常符合我心中的方式,经过尝试,终于用这种方式成功的排除掉了resources/webapp。

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
	<resources>
		<resource>
			<filtering>true</filtering>
			<directory>src/main/resources</directory>
			<excludes>
				<exclude>webapp/**</exclude>
			</excludes>
		</resource>
	</resources>
</build>

首先一个不一样的地方就是,增加了一个filtering节点并且设置值为true

然后在excludes中用/**匹配了webapp下面的所有内容

根据这种原则,我们在打包时只想包含指定的资源文件,可以用标签来实现。

<resources>
		<resource>
			<filtering>true</filtering>
			<directory>src/main/resources</directory>
			<includes>
				<include>webapp/**</include>
			</includes>
		</resource>
	</resources>

如此,只有webapp下面的资源文件才能被打包到目标jar包中。

这种方式来排除资源,即简洁,又能够很容易就明白其中的原因。

总结:

  1. Spring EL表达式和MAVEN的占位符表达式长得一样,但两者默认进水不犯河水,不能再Spring的范围内取maven的参数
  2. filtering的作用就是打通两者的连接, 让井水犯河水, 具体来说是让Spring的范围内能取到maven的参数
  3. filtering的使用要配合resource一起使用: 前者开启打通连接,后者指定打通的范围.

     扫VX 领Java资料,前端,测试,python等等资料都有

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值