结合idea聊聊System.getProperty和System.getenv()的区别

这里是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是获取不到的

相关推荐
千寻技术帮6 分钟前
10410_基于Springboot的文化旅游宣传网站
spring boot·后端·vue·源码·旅游·安装·在线旅游
源码宝14 分钟前
前后端分离架构:不良事件管理系统源码(Vue2+Element UI+Laravel 8)
后端·php·源码·二次开发·程序·不良事件上报·医院不良事件管理系统
Remember_99331 分钟前
【LeetCode精选算法】位运算专题
java·开发语言·jvm·后端·算法·leetcode
源代码•宸33 分钟前
Leetcode—102. 二叉树的层序遍历【中等】
经验分享·后端·算法·leetcode·职场和发展·golang·slice
知无不研43 分钟前
Linux下socket网络编程
linux·运维·网络·后端·socket编程
会算数的⑨1 小时前
Spring AI Alibaba学习(一)—— RAG
java·人工智能·后端·学习·spring·saa
IT 行者1 小时前
Spring Security 7 响应头配置完全指南
java·后端·spring·security
bug-0071 小时前
springboot 自定义消息处理
java·spring boot·后端
人道领域1 小时前
javaWeb从入门到进阶(SpringBoot基础案例3)
java·spring boot·后端
轩情吖1 小时前
数据结构-并查集
开发语言·数据结构·c++·后端··并查集