在Java中通过-D参数声明自定义系统属性会发生什么?
Java中-D自定义系统属性的运行机制
-D参数的作用与生命周期
用java -Dcustom_key=custom_value some_class启动程序时,这个自定义系统属性是直接注入到当前JVM进程的内存中的,和JVM自带的系统属性(比如user.dir)一样,仅在这次运行的JVM生命周期内有效。一旦程序执行完毕、JVM进程终止,这个属性就会被释放,不会留下任何持久化的痕迹。和编译过程的关系
Java的编译(javac命令)与运行(java命令)是完全独立的两个阶段:- 编译阶段只负责将
.java源码转换成.class字节码,不会读取或依赖任何运行时的系统属性; - 系统属性是运行时才生效的配置,和编译环节没有任何关联。所以不管你之前有没有用过-D参数,下次运行程序时如果需要使用这个自定义属性,必须重新通过-D参数声明,不存在“一次声明后续无需再写”的情况。
- 编译阶段只负责将
实际使用示例
假设你的SomeClass里有这段代码:public class SomeClass { public static void main(String[] args) { String customVal = System.getProperty("custom_key"); System.out.println(customVal); } }- 执行
java -Dcustom_key=custom_value SomeClass,会输出custom_value; - 直接执行
java SomeClass,会输出null,因为没有注入这个属性。
- 执行
内容的提问来源于stack exchange,提问作者Kartik Hegde
相关产品推荐
相关产品推荐

