maven filter不起作用

遇到的一个坑, spring boot + maven maven fileter没有起作用。spring boot把默认占位符改了

参考:https://blog.csdn.net/mn960mn/article/details/78834875

创建一个maven项目,项目结构如下:

其中,pom.xml的内容如下:

  1.  
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.  
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.  
    <modelVersion>4.0.0</modelVersion>
  4.  
     
  5.  
    <groupId>com.pp.test</groupId>
  6.  
    <artifactId>properties-test</artifactId>
  7.  
    <version>0.0.1-SNAPSHOT</version>
  8.  
    <packaging>jar</packaging>
  9.  
     
  10.  
    <name>properties-test</name>
  11.  
    <url>http://maven.apache.org</url>
  12.  
     
  13.  
    <parent>
  14.  
    <groupId>org.springframework.boot</groupId>
  15.  
    <artifactId>spring-boot-starter-parent</artifactId>
  16.  
    <version>1.5.9.RELEASE</version>
  17.  
    </parent>
  18.  
     
  19.  
    <properties>
  20.  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  21.  
    <maven.compiler.source>1.8</maven.compiler.source>
  22.  
    <maven.compiler.target>1.8</maven.compiler.target>
  23.  
    <java.version>1.8</java.version>
  24.  
    </properties>
  25.  
     
  26.  
    <dependencies>
  27.  
    <dependency>
  28.  
    <groupId>org.springframework.boot</groupId>
  29.  
    <artifactId>spring-boot-starter-web</artifactId>
  30.  
    </dependency>
  31.  
    </dependencies>
  32.  
     
  33.  
    <build>
  34.  
    <filters>
  35.  
    <filter>src/main/profiles/profile-${profiles.active}.properties</filter>
  36.  
    </filters>
  37.  
    <resources>
  38.  
    <resource>
  39.  
    <filtering>true</filtering>
  40.  
    <directory>src/main/resources</directory>
  41.  
    </resource>
  42.  
    </resources>
  43.  
    </build>
  44.  
     
  45.  
     
  46.  
    <profiles>
  47.  
    <profile>
  48.  
    <id>dev</id>
  49.  
    <properties>
  50.  
    <profiles.active>dev</profiles.active>
  51.  
    </properties>
  52.  
    <activation>
  53.  
    <activeByDefault>true</activeByDefault>
  54.  
    </activation>
  55.  
    </profile>
  56.  
    <profile>
  57.  
    <id>test</id>
  58.  
    <properties>
  59.  
    <profiles.active>test</profiles.active>
  60.  
    </properties>
  61.  
    </profile>
  62.  
    <profile>
  63.  
    <id>prod</id>
  64.  
    <properties>
  65.  
    <profiles.active>prod</profiles.active>
  66.  
    </properties>
  67.  
    </profile>
  68.  
    </profiles>
  69.  
    </project>

application.properties 文件内容:

  1.  
    jdbc.driverClassName=${jdbc.driverClassName}
  2.  
    jdbc.url=${jdbc.url}
  3.  
    jdbc.username=${jdbc.username}
  4.  
    jdbc.password=${jdbc.password}


profile-dev.properties 文件内容:

  1.  
    jdbc.driverClassName=com.mysql.jdbc.Driver
  2.  
    jdbc.url=jdbc:mysql:///db_users
  3.  
    jdbc.username=root
  4.  
    jdbc.password=root


启动应用,报错了,错误如下:

  1.  
    Caused by: java.lang.IllegalArgumentException: Circular placeholder reference 'jdbc.url' in property definitions
  2.  
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:141) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  3.  
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:162) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  4.  
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  5.  
    at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:236) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  6.  
    at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  7.  
    at org.springframework.core.env.AbstractPropertyResolver.resolveNestedPlaceholders(AbstractPropertyResolver.java:227) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  8.  
    at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:84) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  9.  
    at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:61) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  10.  
    at org.springframework.core.env.AbstractEnvironment.getProperty(AbstractEnvironment.java:527) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  11.  
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$1.getProperty(PropertySourcesPlaceholderConfigurer.java:132) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  12.  
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$1.getProperty(PropertySourcesPlaceholderConfigurer.java:129) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  13.  
    at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:81) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  14.  
    at org.springframework.core.env.PropertySourcesPropertyResolver.getPropertyAsRawString(PropertySourcesPropertyResolver.java:71) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  15.  
    at org.springframework.core.env.AbstractPropertyResolver$1.resolvePlaceholder(AbstractPropertyResolver.java:239) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  16.  
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:147) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  17.  
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  18.  
    at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:236) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  19.  
    at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  20.  
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  21.  
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:831) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  22.  
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1086) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  23.  
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  24.  
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  25.  
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  26.  
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
  27.  
    ... 17 common frames omitted



报这个错误的原因是,maven的filtering没有起作用,没有把占位符给替换掉。(大家可以执行mvn clean package,看看打包后的jar里面的application.properties文件,是否有替换占位符)

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

  1.  
    <parent>
  2.  
    <groupId>org.springframework.boot</groupId>
  3.  
    <artifactId>spring-boot-starter-parent</artifactId>
  4.  
    <version>1.5.9.RELEASE</version>
  5.  
    </parent>


点开这个依赖的pom.xml,我们发现

spring boot把默认的占位符号${}改成了@

找到原因了,那怎么解决就很简单了。

方法一:

在pom.xml里面添加如下内容

  1.  
    <properties>
  2.  
    <resource.delimiter>${}</resource.delimiter>
  3.  
    </properties>

方法二:

application.properties里面不用${},改成@

  1.  
    jdbc.driverClassName=@jdbc.driverClassName@
  2.  
    jdbc.url=@jdbc.url@
  3.  
    jdbc.username=@jdbc.username@
  4.  
    jdbc.password=@jdbc.password@


方法三:

pom.xml不继承spring-boot-starter-parent,dependency里面配置全部的依赖和版本号(继承了之后,很多依赖不用写version)

方法四:

  1.  
    <parent>
  2.  
    <groupId>org.springframework.boot</groupId>
  3.  
    <artifactId>spring-boot-starter-parent</artifactId>
  4.  
    <version>1.5.9.RELEASE</version>
  5.  
    </parent>

改成

  1.  
    <dependencyManagement>
  2.  
    <dependencies>
  3.  
    <dependency>
  4.  
    <groupId>org.springframework.boot</groupId>
  5.  
    <artifactId>spring-boot-starter-web</artifactId>
  6.  
    <version>1.5.9.RELEASE</version>
  7.  
    <type>pom</type>
  8.  
    <scope>import</scope>
  9.  
    </dependency>
  10.  
    </dependencies>
  11.  
    </dependencyManagement>
  12.  

原文地址:https://www.cnblogs.com/luckygxf/p/9528152.html