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 系统属性和环境变量的主要内容,如果未能解决你的问题,请参考以下文章

java环境变量配置

Java-环境变量

WIN7怎么配置环境变量JAVAHOME

环境变量怎么设置

Java环境变量的配置

JDK环境变量配置好之后,没有应用