这里是weihubeats ,觉得文章不错可以关注公众号小奏技术
区别
先说结论吧
System.getenv()
:获取环境变量信息System.getProperty()
: 获取系统属性变量
听着好像迷迷糊糊的。我们直接看使用区别
idea
两者在idea
传递值的时候就有区别
我们用一个程序来测试
- 测试程序
java
public static void main(String[] args) {
print("getenv weihubeats-env", System.getenv("weihubeats-env"));
print("getenv weihubeats-property", System.getenv("weihubeats-property"));
print("getProperty weihubeats-env", System.getProperty("weihubeats-env"));
print("getProperty weihubeats-property", System.getProperty("weihubeats-property"));
}
public static void print(String method, String msg) {
System.out.println(method + ": " + msg);
}
首先我们什么都不传
看看idea是如何传递着两个参数的
VM options
主要用来传递Property
属性的
Environment variables
主要用来传递Env
系统环境变量
系统环境变量传递方式就是
kye=value
比如weihubeats-env=weihubeats-env
系统属性变量属性变量则要加-D
比如-Dweihubeats-property=weihubeats-property
像spring
的一些参数都是通过系统属性变量传递的比如
-Dspring.profiles.active=dev
设置系统环境变量和属性变量
运行结果
实际项目中如何传递
System.getenv()
代表系统的环境变量实际和进程没太大关系。
如果能通过System.getenv()
获取到的参数一般在宿主机执行 echo ${xxx}
也能获取到
System.getProperty()
则主要用于启动参数中传递的参数。
比如
java -Dwh=test-property -jar xx.jar
通过启动参数传递后应用程序直接通过
java
System.getProperty("wh");
就能获取到
kubernetes中的pod环境变量传递
实际在用kubernetes
做一些服务编排的时候就会给pod打一些标签,然后通过环境变量传递给应用,比如我们定义一下如下的deployment.yml
yml
spec:
template:
metadata:
labels:
tag: test
spec:
containers:
- env:
- name: DUBBO-PROVIDER-TAG
valueFrom:
fieldRef:
fieldPath: metadata.labels['tag']
这里我们将标签的test
传递给环境变量中
- key:
DUBBO-PROVIDER-TAG
- value:
test
这里传递的环境变量就只能通过
System.getenv()
获取
如果想要通过System.getProperty
获取则还需要将环境变量传递到启动参数中
总结
总的来说主要还是System.getProperty
用的多。主要用于启动参数的获取。
当然也可以通过System.getProperty
获取到一些系统的参数 比如
java
System.getProperty("os.name")
System.getProperty("java.io.tmpdir")
等 但是如果是利用kubernetes
进行环境变量标签传递就需要额外处理,单独使用System.getProperty
是获取不到的