`
234390216
  • 浏览: 10187772 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460516
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771200
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395015
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393708
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678018
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529030
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178306
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:460976
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:149927
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66670
社区版块
存档分类
最新评论

Spring Boot(22)——Maven Filter问题

阅读更多

Maven filter问题

我们可以在项目的pom.xml文件中添加如下内容,其会把src/main/resources目录下的所有文件都当做咨询文件,此外通过<filtering>true</filtering>指定了这些资源文件将经过过滤。过滤的时候可以使用pom.xml中定义的properties或project相关信息等。

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

比如在src/main/resources目录下有个文件app.properties,其定义了app.version=${project.version},通过filter编译后app.properties文件中的${project.version}将会替换为pom.xml中project元素下的version元素的文本值。这是Maven的标准功能。但如果你的项目指定了spring-boot-starter-parent为父工程,则在资源文件中使用的${}占位符内容不会被filter替换。通过查看spring-boot-starter-parent的pom.xml文件可以看到其把分隔符指定为属性resource.delimiter的值。

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <configuration>
        <delimiters>
            <delimiter>${resource.delimiter}</delimiter>
        </delimiters>
        <useDefaultDelimiters>false</useDefaultDelimiters>
    </configuration>
</plugin>

查看properties中定义的resource.delimiter可以看到分隔符被定义为@了。

<properties>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <resource.delimiter>@</resource.delimiter>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.target>${java.version}</maven.compiler.target>
</properties>

所以此时如果需要资源文件中的占位符能够正常被替换,需要改写为类似为app.version=@project.version@形式。或者在自己的pom.xml中的properties元素下定义自己的resource.delimiter,但是最好不要使用${},因为Spring自身的占位符也是${},如果有个资源文件中有个属性原本是期望Spring替换的,结果被Maven替换了就不好了。这也是Spring官方把它分开的原因。

通常使用Maven的filter时用来替换占位符的属性值不会直接定义在pom.xml中,而是定义在一个外部的properties文件中,此时可以通过filter元素进行引用。比如下面的配置指定了用来filter的属性值使用src/main/resources/config.properties文件(此时占位符中使用project的相关属性,比如project.version也还是可以的,包括使用properties元素下定义的内部属性、系统属性等也是OK的)。

<build>
    <filters>
        <filter>src/main/resources/config.properties</filter>
    </filters>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>    

Maven的filter一般会跟profile一起使用,基于不同的profile使用不同的属性配置文件来替换占位符,该工作也可以使用Spring的profile实现。

(注:本文基于Spring Boot 2.0.3所写)

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics