第一种用法
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表达式冲突。解决方法如下:
- 此时parent依赖将maven占位符表达式默认改为@var@的形式. 所以只能用@var@替代${var}
- 在pom.xml里面添加如下内容
<properties>
<resource.delimiter>${}</resource.delimiter>
</properties>
- 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包中。
这种方式来排除资源,即简洁,又能够很容易就明白其中的原因。
总结:
- Spring EL表达式和MAVEN的占位符表达式长得一样,但两者默认进水不犯河水,不能再Spring的范围内取maven的参数
- filtering的作用就是打通两者的连接, 让井水犯河水, 具体来说是让Spring的范围内能取到maven的参数
- filtering的使用要配合resource一起使用: 前者开启打通连接,后者指定打通的范围.
扫VX 领Java资料,前端,测试,python等等资料都有