假设我们拥有这样一个需求:
目前存在几套环境,我们需要对接每套环境中的API,但是每套环境的API地址、用户信息都不同。
解决方案:
如果我们使用 maven 可以直接通过不同的 profile 来实现。但是,我们这里将要介绍的并不是这种方案,而是通过在属性文件中,通过“${}”引用 maven 中定义的属性。
先看看我们的 pom.xml 文件,如下:
<build>
<finalName>learn-maven-properties</finalName>
<!-- 必须开启资源过滤 -->
<!-- 只有我们开启资源过滤后,在 properties 文件中才能引用我们在 pom 文件中定义的属性 -->
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
</build>
<profiles>
<profile>
<id>default</id>
<properties>
<!-- 自定义属性 -->
<maven-apiUrl>https://192.168.10.180:8080</maven-apiUrl>
<maven-username>root</maven-username>
<maven-password>aaaaaa</maven-password>
</properties>
<activation>
<!-- 设置默认激活这个配置 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>release</id>
<properties>
<!-- 自定义属性 -->
<maven-apiUrl>https://10.87.11.228:8080</maven-apiUrl>
<maven-username>root</maven-username>
<maven-password>relase_password</maven-password>
</properties>
</profile>
</profiles>注意:上面的 resources 标签一定要配置,该标签用来过滤资源。maven 将会把属性文件中引用 pom.xml 文件中的属性,替换成实际的之。
属性配置文件内容如下:
app=learn-maven-properties
version=1.0.0
## 下面信息有maven profile动态设置
apiUrl=${maven-apiUrl}
username=${maven-username}
password=${maven-password}java代码中使用这些属性:
package com.huangx.maven;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class LoadPropertyDataImpl {
@Value("${app}")
private String app;
@Value("${version}")
private String version;
@Value("${apiUrl}")
private String apiUrl;
@Value("${username}")
private String username;
@Value("${password}")
private String password;
public void getData() {
System.out.println("app = " + app);
System.out.println("version = " + version);
System.out.println("apiUrl = " + apiUrl);
System.out.println("username = " + username);
System.out.println("password = " + password);
}
}然后,我们执行 maven 的 package 生命周期,打包项目,在进入到 target/classes 目录中,你会看见你的属性文件已经被替换了。
注意,这里的多环境解决方案目的是为了讲解怎样在属性文件中引用 pom.xml 文件中定义的属性。