pom.xml和Java代码中使用相同的属性properties
需求描述
我在 pom.xml 中添加了一个节点:
<properties>
<app.build.name>testApp</app.build.name>
</properties>
我怎么能在 Java 代码中得到这个 "testApp" 值?
String name = System.getProperty("app.build.name"); // output name = null
这段代码在运行时给了我 null
。
并且,我还需要把这个属性用在了 pom.xml 中的另一个结点中
<build>
<finalName>${app.build.name}</finalName>
</build>
maven之pom.xml之build之finalName 可以指定jar包的文件名
解决思路分析
据我所知,网上没有一个特别常用的 Maven 插件把 Maven 中用到的属性放入到 System.getProperties() 中,方便我们使用 System.getProperty() 来获取。
所以,前一节需求分析中代码
System.getProperty("app.build.name");
返回null
。
但是,我们可以使用 maven-resources-plugin filter(点击了解更多) 这个技术,把变量编译到我们的资源文件 xxx.properties 中。
这些变量可以来自系统属性、项目属性、过滤器资源和命令行。
Java环境变量属性
例如常用的 ${java.version}
表示jdk的版本。
- 可以在 pom.xml 中使用的java环境变量
${java.version}
; - 还可以通过
System.getProperty("java.version")
在代码中获取。
这类属性,其实不需要多做什么配置,就可以在 pom.xml 和 Java 代码中共用。
import java.util.Properties;
public class JavaPropertiesPrinter {
public static void println() {
Properties properties = System.getProperties();
properties.forEach((k, v) -> {
System.out.println("${" + k + "}=" + v);
});
}
public static void main(String[] args) {
JavaPropertiesPrinter.println();
}
}
这段 Java 代码可以打印出 java环境变量
# 我挑了几个有代表性的给大家展示一下
${user.dir}=D:\
${java.io.tmpdir}=C:\Users\geekziyu\AppData\Local\Temp\
操作系统的环境变量
当前使用的操作系统不同,系统环境变量的查看方式不同:
- windows下通过右键我的电脑-》属性-》高级系统设置-》高级-》环境变量查看,或者win+R呼出任务行键入sysdm.cpl进行查看。
- 类Unix操作系统,则可以在shell命令行界面键入 env 命令查看。
在 Maven 项目中引用操作系统的环境变量的方式:
- 可以在 pom.xml 中使用
${env.PATH}
方法; - 还可以通过
System.getenv("PATH")
在代码中获取。
★ 其他变量
除了可以直接用 System.getProperty("java.version")
获取的java环境变量,以及直接用 System.getenv("PATH")
获取的操作系统环境变量,
其他的属性想要在 pom.xml 和代码中共用,则需要借助一个“媒介”资源文件,比如在 Maven 项目中创建一个资源文件:
src/main/resources/project.properties
项目变量
<build>
<finalName>testApp</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
在“媒介”资源文件 project.properties 中新增:
app.build.name=${project.build.finalName}
最后,在您的源代码(MyUtil.java
)中,加载“媒介”资源文件 project.properties :
Properties props = new Properties();
props.load(MyUtil.class.getClassLoader().getResourceAsStream("project.properties"));
String version = props.getProperty("app.build.name");
自定义属性
在 pom.xml 和 Java 代码中都需要使用 <properties> 中的属性:
<properties>
<myTag>yyds</myTag>
</properties>
<build>
<finalName>testApp-${myTag}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
然后,仍然需要在“媒介”资源文件 project.properties 中新增:
tag=${myTag}
最后,在您的源代码(MyUtil.java
)中,加载“媒介”资源文件 project.properties :
Properties props = new Properties();
props.load(MyUtil.class.getClassLoader().getResourceAsStream("project.properties"));
String tag= props.getProperty("tag"); // yyds
综上所述
接下来以一张表格来表现 pom.xml 或 Java 代码中使用相同属性的方式:
属性来源 | pom.xml 中使用 | Java代码中使用 |
---|---|---|
Java环境变量 | ${java.version} |
System.getProperty("java.version") |
操作系统环境变量 | ${env.PATH} |
System.getenv("PATH") |
项目变量、自定义变量等 | ${custom} |
Properties props = new Properties(); |
项目变量、自定义变量等都需要用到一个“媒介”资源文件
src/main/resources/project.properties
。
把 Maven 项目在编译时,可以把变量值保存到“媒介”资源文件中,然后 Java 代码在 运行时可以通过“媒介”资源文件获取到该变量。