Java中的System.getenv()和System.getProperty()使用详解

 更新时间:2024年11月27日 08:54:43   作者:星辰鸿溟  
文章介绍了Java中用于读取环境配置信息的两种方法:System.getenv()和System.getProperty(),前者读取系统环境变量,返回一个不可修改的Map;后者获取JVM环境变量值,可以通过-D参数设置,文章还提到,通过这两种方法可以简化配置,不需要修改代码

System.getenv()和System.getProperty()是Java种常用的两种读取环境配置信息的方法,它们都是java.lang.System类的方法,用途有相似之处,但我们在实际使用中,需要更加注意二者的区别。

1. System.getenv()

System.getenv()读取的是当前系统环境的环境变量。

要深入理解环境变量的本质,需要对系统父子进程关系有更加清晰的认识。

一般来说,子进程在创建时,会将父进程当时的环境变量复制一份,而父进程中之后发生的环境变量的变动,不会影响子进程中对应的环境变量。

当不传入参数时,System.getenv()的返回值为一个只读的Map,其中包括当前环境下所有环境变量。

下面的例子中:

我们将打印出这条语句执行时环境中所有的环境变量和它们对应的值,在 windows 中是 用户环境变量和系统环境变量的值,

System.getenv().forEach((key, value) -> {
    System.out.println(key + ":" + value);
});

注意:通过 System.getenv() 获取的 Map 是不支持修改的,为了有更深入的理解,我们熟悉下这块的代码

  public static java.util.Map<String,String> getenv() {
      // ......
      return ProcessEnvironment.getenv();
  }

ProcessEnvironment.getenv() 该方法的核心逻辑如下,从以下代码中可以看出,返回的 map 是通过Collections.unmodifiableMap() 处理的,因此,返回的map 是不能被修改的。

final class ProcessEnvironment extends HashMap<String,String>{
    private static final Map<String,String> theUnmodifiableEnvironment;
    static {
        theEnvironment  = new ProcessEnvironment();
		theUnmodifiableEnvironment
           	 = Collections.unmodifiableMap(theEnvironment);
    }
    // Only for use by System.getenv()
    static Map<String,String> getenv() {
        return theUnmodifiableEnvironment;
    }
}

一般我们在程序中使用时,一般不会获取全部的系统环境变量,因而可以通过 System.getEnv(key) 获取对应环境变量的值。

 public static String getenv(String name) {
     // .....
     return ProcessEnvironment.getenv(name);
 }

2. System.getProperty()

通上,通过 System.getProperty(key)获取单个变量值,通过System.getPropertys() 获取所有 JVM 环境变量值。

如下:

System.getProperties().forEach((k,v) -> {
    System.out.println(k + "=" + v);
});

这里列出一些常见的

// classpath
sun.boot.class.path=C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;....
java.library.path=C:\Program Files\Java\jdk1.8.0_131\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;
file.separator=\
sun.jnu.encoding=GBK
java.version=1.8.0_131
java.vm.info=mixed mode

当我们通过 启动JVM时,可以通过 -D 设置JVM 环境变量值,在我们的程序中我们也可以通过,System.setProperty(key,value) 设置JVM 环境变量,该值在整个JVM 间是共享的。

使用场景

最近线上大数据 Hadoop 集群开启了Kerberos,为了让业务尽量不改动代码的原则。

通过 System.getenv()System.getenv() 实现了业务代码零改动下,使用开启Kerberos后的集群。

总结

通过 System.getenv()getProperty() 可以简化我们的有些配置,相比于 xml 等配置文件。

这种方式更轻量,如果我们的程序中没有配置文件,但想使某一两项功能实现可配置,通过System.getenv()getProperty()可以非常容易的实现。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • idea2020.3配置maven环境并配置Tomcat的详细教程

    idea2020.3配置maven环境并配置Tomcat的详细教程

    这篇文章主要介绍了idea2020.3配置maven环境并配置Tomcat的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 在SpringBoot中整合使用Netty框架的详细教程

    在SpringBoot中整合使用Netty框架的详细教程

    这篇文章主要介绍了在SpringBoot中整合使用Netty框架的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • springboot pojo对象日期属性的问题

    springboot pojo对象日期属性的问题

    这篇文章主要介绍了springboot pojo对象日期属性的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringBoot+RabbitMQ 实现死信队列的示例

    SpringBoot+RabbitMQ 实现死信队列的示例

    本文主要介绍了SpringBoot+RabbitMQ 实现死信队列的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • SpringBoot如何使用过滤器进行XSS防御

    SpringBoot如何使用过滤器进行XSS防御

    想对全局的请求都进行XSS防御可以使用servlet中的过滤器或者spring mvc中的拦截器,下面我们就来看看如何使用servlet中的过滤器进行XSS防御吧
    2024-11-11
  • java中的匿名内部类详细总结

    java中的匿名内部类详细总结

    以下是对java中的匿名内部类进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • Spring Security中如何获取AuthenticationManager对象

    Spring Security中如何获取AuthenticationManager对象

    有时需要使用AuthenticationManager(以下简称Manager)对象,可是这个对象不是Bean,没有直接保存在Spring的Bean库中,那么如何获取Spring Security中的这个对象呢,需要的朋友可以参考下
    2022-11-11
  • MyBatis-Plus+达梦数据库实现高效数据持久化的示例

    MyBatis-Plus+达梦数据库实现高效数据持久化的示例

    这篇文章主要介绍了MyBatis-Plus和达梦数据库实现高效数据持久化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • SpringBoot中的server.context-path的实现

    SpringBoot中的server.context-path的实现

    本文主要介绍了SpringBoot中的server.context-path的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • Maven构建Hadoop项目的实践步骤

    Maven构建Hadoop项目的实践步骤

    本文主要介绍了Maven构建Hadoop项目的实践步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论