如何阅读;“操作系统变量”;来自Java(不是System.properties)

如何阅读;“操作系统变量”;来自Java(不是System.properties),java,environment-variables,configuration-files,system-properties,12factor,Java,Environment Variables,Configuration Files,System Properties,12factor,我刚刚读了这篇优秀的文章,我对它非常感兴趣。在这方面,作者强调: 12因素应用程序将配置存储在环境变量中(通常缩写为env vars或env)。Env-vars很容易在部署之间进行更改,而无需更改任何代码;与配置文件不同,它们被意外签入代码repo的可能性很小;与自定义配置文件或其他配置机制(如Java系统属性)不同,它们是语言和操作系统无关的标准 我想知道这对Java项目意味着什么。 通常,当谈到我的Java应用程序时,我认为“env vars”是我可以从System.getProperty(

我刚刚读了这篇优秀的文章,我对它非常感兴趣。在这方面,作者强调:

12因素应用程序将配置存储在环境变量中(通常缩写为env vars或env)。Env-vars很容易在部署之间进行更改,而无需更改任何代码;与配置文件不同,它们被意外签入代码repo的可能性很小;与自定义配置文件或其他配置机制(如Java系统属性)不同,它们是语言和操作系统无关的标准

我想知道这对Java项目意味着什么。

通常,当谈到我的Java应用程序时,我认为“env vars”是我可以从
System.getProperty(“blah”)
中读取的东西。这就是作者所说的吗?我不认为是这样,因为作者明确指出“与……或其他配置机制(如Java系统属性)不同……”

如果不是,那么符合本文档“env-var”定义的操作系统不可知的“env-var”的示例是什么?如何从Java代码内部读取它

无论哪种方式,某些进程都必须首先在操作系统上设置每个环境变量,以便在应用程序运行时设置并可用该变量。哪些进程/方法可以执行这种类型的预运行设置?

使用
System.getenv()
而不是
System.getProperty()
System.getenv()
返回操作系统中定义的指定环境变量的值

另一种可能更可取的方法是使用
-D
命令开关将所选OS环境变量传递给JVM,然后使用
System.getProperty()
检索它们。这种方式更跨平台:即使特定平台不支持特定变量,也可以使用相同的java代码

更新操作系统变量绝对是另一项任务。首先,我不认为你真的想这样做。如果你仍然想问另一个问题:可能存在其他解决方案

在JDK中没有跨平台API可以做到这一点,我也不知道第三方库也可以做到这一点。我个人计划实施一个,但到目前为止还没有时间

Windows将变量存储在注册表中,所以您可以将变量添加到注册表中。但这不会影响shell的当前实例,所以您自己的java进程不会看到它自己更新的变量。但是,您可以创建进程并运行
设置myvar=myvalue
。如果要写入注册表,可以使用任何可用的库。偶尔我也实现了这样的库。它的优点是不运行任何本机代码,而且非常紧凑。看一看

在Unix上,可以运行
myvar=myvalue
,如果希望其他进程看到此变量,则必须运行
export myvar
。但它仍然不能使这个变量持久化。如果希望此变量在操作系统重启后继续存在,则必须将其添加到初始脚本之一(例如
.bashrc
)。但这完全取决于您的系统、配置、权限、shell等。

使用
system.getenv()
而不是
system.getProperty()
System.getenv()
返回操作系统中定义的指定环境变量的值

另一种可能更可取的方法是使用
-D
命令开关将所选OS环境变量传递给JVM,然后使用
System.getProperty()
检索它们。这种方式更跨平台:即使特定平台不支持特定变量,也可以使用相同的java代码

更新操作系统变量绝对是另一项任务。首先,我不认为你真的想这样做。如果你仍然想问另一个问题:可能存在其他解决方案

在JDK中没有跨平台API可以做到这一点,我也不知道第三方库也可以做到这一点。我个人计划实施一个,但到目前为止还没有时间

Windows将变量存储在注册表中,所以您可以将变量添加到注册表中。但这不会影响shell的当前实例,所以您自己的java进程不会看到它自己更新的变量。但是,您可以创建进程并运行
设置myvar=myvalue
。如果要写入注册表,可以使用任何可用的库。偶尔我也实现了这样的库。它的优点是不运行任何本机代码,而且非常紧凑。看一看

在Unix上,可以运行
myvar=myvalue
,如果希望其他进程看到此变量,则必须运行
export myvar
。但它仍然不能使这个变量持久化。如果希望此变量在操作系统重启后继续存在,则必须将其添加到初始脚本之一(例如
.bashrc
)。但这完全取决于您的系统、配置、权限、shell等。

使用
system.getenv()
而不是
system.getProperty()
System.getenv()
返回操作系统中定义的指定环境变量的值

另一种可能更可取的方法是使用
-D
命令开关将所选OS环境变量传递给JVM,然后使用
System.getProperty()
检索它们。这种方式更跨平台:即使特定平台不支持特定变量,也可以使用相同的java代码

更新操作系统变量绝对是另一项任务。首先,我不认为你真的想这样做。如果你仍然想问另一个问题:可能存在其他解决方案

在JDK中没有跨平台API可以做到这一点,我也不知道第三方库也可以做到这一点。我个人计划实施一个,但到目前为止还没有时间

Windows将变量存储在注册表中,所以您可以将变量添加到注册表中。但这并不影响shell的当前实例,所以您可以使用自己的java pr
System.getenv(env);
System.getProperties();