前言
首先说明,这是一篇工具文章,主要记录下我们Java环境变量和系统属性,方便以后的查阅。
当程序中需要使用与操作系统相关的变量(例如:文件分隔符、换行符)时,Java提供了System类的静态方法getenv()和getProperty()用于返回系统相关的环境变量与系统属性。
- getenv方法返回的变量大多与操作系统相关
- getProperty方法返回的变量大多与java程序有关
系统属性和环境变量都是key-value形式的。两种机制都能用来将用户定义的信息传递给 Java进程。
- 环境变量产生更多的全局效应,因为它们不仅对Java子进程可见,而且对于定义它们的进程的所有子进程都是可见的。在不同的操作系统上,它们的语义有细微的差别,比如,不区分大小写。
因此环境变量更可能有意料不到的副作用。程序中尽可能使用系统属性。环境变量应该在需要全局效应的时候使用,或者在外部系统接口要求使用环境变量时使用(比如 PATH)
Demo
环境变量Env
使用System.getenv()获取系统的所有环境变量的Map,注意它是一个UnmodifiableCollection,是一个只读视图
环境变量并不提供set方法,即没有System.setEnv…方法
public static void main(String[] args) { Map<String, String> envMap = System.getenv(); envMap.forEach((key, value) -> { System.out.println(key + "=" + value); }); }
小吐槽一句:getenv()这个方法并没有遵循驼峰规范,个人认为它是一种不规范的命名方式。Java.awt中有一个类(我记不太清楚了)所有方法命名都没遵循驼峰,后来在1.1里就被另外一个类代替,自己被标记为过时了,课件JDK对标准的重视~~
下面看输出结果,然后做解释如下:
系统属性Property
系统属性的作用范围没那么大,所以Java是允许我们用API的方式.setProperty
自己设置系统属性的。
public static void main(String[] args) { Properties properties = System.getProperties(); System.setProperty("myProperty", "自定义的系统属性~"); // 允许自定义系统属性 properties.forEach((key, value) -> { System.out.println(key + "=" + value); }); }
下面看输出结果,然后做解释如下:
汇总
下面是对常用的,我们更关注的key做了个文本总结,方便搜索、查阅。
环境变量:
USERPROFILE :用户目录 USERDNSDOMAIN :用户域 PATHEXT :可执行后缀 JAVA_HOME :Java安装目录 TEMP :用户临时文件目录 SystemDrive :系统盘符 ProgramFiles :默认程序目录 USERDOMAIN :帐户的域的名称 ALLUSERSPROFILE :用户公共目录 SESSIONNAME :Session名称 TMP :临时目录 Path :path环境变量 CLASSPATH :classpath环境变量 PROCESSOR_ARCHITECTURE :处理器体系结构 OS :操作系统类型 PROCESSOR_LEVEL :处理级别 COMPUTERNAME :计算机名 Windir :系统安装目录 SystemRoot :系统启动目录 USERNAME :用户名 ComSpec :命令行解释器可执行程序的准确路径 APPDATA :应用程序数据目录
系统属性:
java.version Java :运行时环境版本 java.vendor Java :运行时环境供应商 java.vendor.url :Java供应商的 URL java.home :Java安装目录 java.vm.specification.version: Java虚拟机规范版本 java.vm.specification.vendor :Java虚拟机规范供应商 java.vm.specification.name :Java虚拟机规范名称 java.vm.version :Java虚拟机实现版本 java.vm.vendor :Java虚拟机实现供应商 java.vm.name :Java虚拟机实现名称 java.specification.version:Java运行时环境规范版本 java.specification.vendor:Java运行时环境规范供应商 java.specification.name :Java运行时环境规范名称 java.class.version :Java类格式版本号 java.class.path :Java类路径 java.library.path :加载库时搜索的路径列表 java.io.tmpdir :默认的临时文件路径 java.compiler :要使用的 JIT编译器的名称 java.ext.dirs :一个或多个扩展目录的路径 os.name :操作系统的名称 os.arch :操作系统的架构 os.version :操作系统的版本 file.separator :文件分隔符 path.separator :路径分隔符 line.separator :行分隔符 user.name :用户的账户名称 user.home :用户的主目录 user.dir:用户的当前工作目录
附:SpringBoot中"/env"端点的访问结果:
飘红的两处就是对应着咱们本文的一些值。(可以看出它哥俩的优先级还是相对来说比较高的,比我们自定的配置文件application.properties的优先级高)
总结
这边文章的意义一方面是作为工具文章,方便查阅。另一方面是为了解Spring的环境、属性配置机制做铺垫,让能有个更快的了解。
其实Spring对环境变量、配置管理的了解程度,将直接影响到你对SpringBoot和Spring Cloud的深入学习,因为它哥俩基本上靠配置驱动了非常多的东西。比如Endpoint、Actuator、Enviroment等等,而环境变量和系统属性是在此处、甚至在Maven中必不可少的一环~