正如webx框架文档里面所说,在一个应用中我们总是会遇到一些参数,例如:数据库服务器IP地址、端口、用户名;这些参数有一个共性,那就是:它们和应用的逻辑无关,只和当前环境、当前系统用户相关。以下场景很常见:
很明显,这些参数不适合被“硬编码”在配置文件或代码中。因为每一个从源码库中取得它们的人,都有可能需要修改它们,使之与自己的环境相匹配。本文我们来看看让配置文件与应用逻辑分离几种方法
需要在pom文件里面添加下面配置
<build>
<filters>
<filter>${user.home}/antx.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
然后在项目目录执行:mvn resources:resources。则会把项目目录src/main/resources下面的.xml里面的占位符变量${}使用antx.properties配置文件中的变量值进行替换
注意:Maven filter机制在build时刻永久性改变被过滤的配置文件的内容,build结束以后无法更改。这将导致一个问题:如果要改变配置文件的参数,必须获取源码并重新build。
首先需要在pom添加如下:
<plugin>
<groupId>com.alibaba.citrus.tool</groupId>
<artifactId>autoconfig-maven-plugin</artifactId>
<version>1.2</version>
<configuration>
<dest>src/main/resources/</dest>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>autoconfig</goal>
</goals>
</execution>
</executions>
</plugin>
项目目录如下:
image.png
然后下载autoconfig二进制包: http://repo1.maven.org/maven2/com/alibaba/citrus/tool/antx-autoconfig/1.2/antx-autoconfig-1.2.tgz 下载后解压,添加bin目录到环境变量
然后执行 autoconfig jar包,会提示你替换jar里面的配置文件,然后jar里面的配置文件内容会被修改。
image.png
注:AutoConfig不需要重新build源码,就可以改变目标jar文件中所有配置文件中placeholders的值。
上面两种都是在非运行态进行替换的,PropertyPlaceholderConfigurer则是在运行态对占位符进行替换
image.png
image.png
注意:这种是在运行时进行替换。
pom添加下面插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<executable>false</executable>
<excludeDevtools>true</excludeDevtools>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
执行打包后,使用:jar -jar jar包 --spring.config.location=antx.properties执行 注: 这种做到了应用部署包和配置完全分离,是比较好的一种方式。