第一种用法
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 大概率无效
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 一起使用: 前者开启打通连接,后者指定打通的范围.
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于