Java 系统属性和环境变量
Posted
技术标签:
【中文标题】Java 系统属性和环境变量【英文标题】:Java system properties and environment variables 【发布时间】:2011-10-26 15:59:25 【问题描述】:JVM中系统属性System.getProperties()和环境变量System.getenv()有什么区别?
【问题讨论】:
【参考方案1】:系统属性使用-Dpropertyname=value
语法在Java命令行上设置。它们也可以在运行时添加
使用System.setProperty(String key, String value)
或通过各种
System.getProperties().load()
方法。
要获取特定的系统属性,您可以使用System.getProperty(String key)
或System.getProperty(String key, String def)
。
环境变量在操作系统中设置,例如在 Linux export HOME=/Users/myusername
或 Windows SET WINDIR=C:\Windows
等中,
并且,与属性不同,可能不在运行时设置。
要获取特定的环境变量,您可以使用System.getenv(String name)
。
【讨论】:
绝对正确,波西米亚人。环境变量是“OS 事物”,属性是“Java 事物”。碰巧的是,Java 选择将 OS 变量作为属性公开(就像 Java 将当前目录和“其他东西”作为属性公开一样),但它们实际上是不同的东西。 @Bohemian 如果我通过java -Dpropname=value
设置属性,我该如何检索这些属性?
System.grtProperties()
列出了所有属性,并且从命令行设置的属性将在那里,但是如果您要问的话,无法将它们与系统添加的其他属性区分开来。
注意,你也可以通过环境变量JAVA_TOOL_OPTIONS
来设置系统属性。
@KanagaveluSugumar 是的,您需要重新启动:启动时从环境中读取环境变量设置。即System.getenv(String name)
不会在调用时从系统中动态读取值。【参考方案2】:
我认为两者之间的区别归结为访问。环境变量可由任何进程访问,而 Java 系统属性只能由它们添加到的进程访问。
正如 Bohemian 所说,环境变量是在操作系统中设置的(但是它们“可以”通过 Java 设置),系统属性作为命令行选项传递或通过setProperty()
设置。
【讨论】:
最后是变量的添加方式和变量的作用域。 请记住,其他进程可以找到用于启动进程的 cmd,因此也可以找到 java 系统属性。 还有更多内容。本教程详细解释:youtu.be/vQYfOMrdgpg - 基本上 env vars 也可以有范围,例如设置在一个外壳中可能在另一个外壳中不可见。您通常不能在运行时设置它们,因为它们在主机上,但是您可以使用扩展等在 JUnit 5 中(在运行时)设置它们。 这个答案似乎不正确。环境变量的范围是每个进程。每个进程都会看到自己的环境。 环境变量映射是 Windows 和每个 UNIX 后代中的每个进程对象。最好考虑的是“进程属性”或者某种进程私有的东西。此映射是在创建流程时创建的。初始值由创建流程的人设置。通常,此地图应是创建者地图的副本。用户应用程序一般是由用户shell创建的,因此,用户应用程序的环境一般应由用户shell环境的副本构成。这里没有动态继承,没有“回退到父”机制。以上是关于Java 系统属性和环境变量的主要内容,如果未能解决你的问题,请参考以下文章