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中占位:
然后在pom中配置资源过滤:app.version=@project.version@<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
相关产品推荐
相关产品推荐

