maven如何过滤占位符
今天遇到一个问题,就是properties文件中赋值用的这种形式${xxx},真正的值是配置在pom的profile中,但是未生效。
后来找到原因,原来是pom中少了一段代码:
<build> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> <filtering>true</filtering> </resource> <resource> <directory>${project.basedir}/bin</directory> <targetPath>/bin</targetPath> <filtering>true</filtering> </resource> </resources> </build>
关于profile的详细介绍参见如下:
使用maven管理项目有一个好处是就是可以针对不同的环境使用不同的编译打包设置,方便了多环境下的打包部署,一般我们开发项目都会有至少开发环境和正式环境两个,针对这两个环境的配置信息也会有所不同,比如数据库的配置等。我们可以使用maven的profile定义来进行区分,比如我们在项目的pom文件中定义如下片段:
-
<project>
-
<modelVersion>4.0.0</modelVersion>
-
<groupId>cc.mzone</groupId>
-
<artifactId>myjar</artifactId>
-
<version>0.1</version>
-
<packaging>jar</packaging>
-
<build>
-
<resources>
-
<resource>
-
<directory>src/main/resources</directory>
-
<includes>
-
<include>*.*</include>
-
</includes>
-
<filtering>true</filtering>
-
</resource>
-
</resources>
-
</build>
-
-
<properties>
-
<jdbc.url>jdbc:mysql://localhost:3306/abc</jdbc.url>
-
<jdbc.username>root</jdbc.username>
-
<jdbc.password>root</jdbc.password>
-
</properties>
-
-
<profiles>
-
<profile>
-
<id>product</id>
-
<properties>
-
<jdbc.url>jdbc:mysql://localhost:3306/abc123</jdbc.url>
-
<jdbc.username>rootuser</jdbc.username>
-
<jdbc.password>rootpwd</jdbc.password>
-
</properties>
-
</profile>
-
</profiles>
-
</project>
这里我们在pom文件中定义了数据库的相关配置,同时定义了一个profile,其id为product,同时在这个profile中也定义了数据库的相关配置。这样我们使用mvn package命令时就可以使用默认的jdbc设置,当我们使用mvn package -P product时maven就会自动使用id为product的profile中的数据库配置,这个是maven读取属性配置文件的覆盖。
然后再看pom文件中的resources段的配置:
-
<resources>
-
<resource>
-
<directory>src/main/resources</directory>
-
<includes>
-
<include>*.*</include>
-
</includes>
-
<filtering>true</filtering>
-
</resource>
-
</resources>
其中最重要的是<filtering>true</filtering>这段,这个配置的意思是过滤上面指定属性文件中的占位符,占位符是${变量名称}这样的形式,maven会自动读取配置文件,然后解析其中的占位符,使用上面pom文件中定义的属性进行替换。我们可以在src/main/resources下定义一个jdbc.properties配置文件,内容如下:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=${jdbc.url} jdbc.username=${jdbc.username} jdbc.password=${jdbc.password}
执行的效果如下:
## 使用默认的配置信息 mvn clean package ## 使用product环境的配置信息 mvn clean package -P product
分两次执行上面的命令后,然后到项目的target目录下查看打包后的结果,可以看到jdbc.properties文件的内容随着打包的参数不同而变化了,从而也就实现了我们多环境的配置自动打包了。