第一种用法

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 一起使用: 前者开启打通连接,后者指定打通的范围.
  •