You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java系统属性、application.properties与Maven属性:差异、引用及标准问询

Java系统属性、Spring Boot application.properties与Maven pom.xml属性的区别与关联

1. 三类属性的核心差异

用途与定位

  • Java系统属性:JVM层面的全局配置,用于控制JVM运行时行为(如java.io.tmpdir临时目录)、跨应用的通用环境参数,聚焦运行时的基础环境配置。
  • Spring Boot application.properties:Spring Boot应用专属配置,负责Spring框架、第三方组件(数据库、消息队列等)及业务自定义参数的配置,是应用级的业务/功能配置载体。
  • Maven pom.xml属性:构建阶段的流程配置,用于管控Maven的依赖版本、打包规则、插件行为等,仅作用于编译、打包、测试等构建环节。

加载时机与生命周期

  • Java系统属性:JVM启动时加载(可通过-D启动参数或代码System.setProperty()动态设置),运行时全程有效且可修改。
  • application.properties:Spring Boot应用启动时加载(遵循Spring的配置优先级规则,外部配置优先级更高),部分配置可通过Spring的Environment在运行时动态刷新。
  • pom.xml属性:Maven执行构建命令时加载,构建完成后默认不会带入应用运行时环境。

作用域

  • Java系统属性:整个JVM进程全局可见,所有代码均可通过System.getProperty()直接读取。
  • application.properties:仅在Spring应用上下文内生效,需通过Spring的@Value注解、Environment接口等方式获取,非Spring管理的代码无法直接访问。
  • pom.xml属性:仅在Maven构建流程中有效,作用于依赖解析、插件执行等构建环节。

2. 互相引用的实现方式

Maven → Java系统属性

可以通过Maven插件将pom属性传递为JVM系统属性:

  • 测试阶段:通过maven-surefire-plugin配置,让测试代码能读取pom属性:
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <systemPropertyVariables>
                <app.version>${project.version}</app.version>
            </systemPropertyVariables>
        </configuration>
    </plugin>
    
  • 打包时替换配置文件:开启资源过滤,将pom属性写入application.properties:
    在application.properties中占位:
    app.version=@project.version@
    
    然后在pom中配置资源过滤:
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
    

Java系统属性 → Spring Boot application.properties

Spring Boot原生支持在配置文件中引用系统属性,通过${}语法即可:

server.port=${custom.server.port:8080}

启动时通过java -jar app.jar -Dcustom.server.port=9090设置系统属性,Spring Boot会自动读取该值作为端口。

Java系统属性 → Maven

Maven构建时可直接读取系统属性,比如在pom中使用${java.version}获取JVM版本,或通过命令行传递:

mvn clean install -Dcustom.build.prop=testValue

然后在pom中通过${custom.build.prop}引用该值。

Spring Boot → Maven / Java系统属性 → Maven反向引用

Spring Boot运行时的配置无法反向传递给Maven,因为Maven构建流程早于应用运行时;Java系统属性只能在Maven构建时传递给它,无法在运行时反向影响构建环节。

3. 与Java/JEE标准的关系

  • Java系统属性:属于Java SE标准,是JDK官方规范的一部分,所有符合Java规范的JVM都必须支持。
  • Spring Boot application.properties:不属于Java/JEE标准,是Spring Boot框架自定义的配置机制,属于Spring生态的扩展方案。
  • Maven pom.xml属性:不属于Java/JEE标准,是Apache Maven构建工具的自定义配置,与Java/JEE规范无直接关联。

内容的提问来源于stack exchange,提问作者whatspoppin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:55:19