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.xmlJava 代码中共用。

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.xmlJava 代码中都需要使用 <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.xmlJava 代码中使用相同属性的方式:

属性来源 pom.xml 中使用 Java代码中使用
Java环境变量 ${java.version} System.getProperty("java.version")
操作系统环境变量 ${env.PATH} System.getenv("PATH")
项目变量、自定义变量等 ${custom} Properties props = new Properties();
props.load(MyUtil.class.getClassLoader().getResourceAsStream("project.properties"));
String tag= props.getProperty("custom");

项目变量、自定义变量等都需要用到一个“媒介”资源文件 src/main/resources/project.properties
把 Maven 项目在编译时,可以把变量值保存到“媒介”资源文件中,然后 Java 代码在 运行时可以通过“媒介”资源文件获取到该变量。

参考文档

MAVEN 属性
如何从 pom.xml 获取属性值?

posted @ 2022-05-09 16:05  极客子羽  阅读(577)  评论(0编辑  收藏  举报