繁体   English   中英

如何从Java(不是System.properties)读取“ OS变量”

[英]How to read “OS variables” from Java (not System.properties)

我刚刚阅读了出色的12因子应用程序文档,它确实向我注册了。 第3章Config中 ,作者强调:

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

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

通常,当涉及到Java应用程序时,我认为“ env vars”是我可以从System.getProperty("blah")读取的内容。 这是作者在说什么吗? 我不认为这是因为作者明确声明了“ 并且与...或其他配置机制(例如Java System Properties ...)不同 ”。

如果不是,那么满足本文档对“ env var”的定义的与操作系统无关的“ env var”的示例将是什么? 我将如何从Java代码内部读取它?

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

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

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

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

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

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

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

是的,作者正在谈论环境变量。 您可以使用以下代码段从Java代码读取环境变量:

System.getenv(env);

请参阅: http : //docs.oracle.com/javase/8/docs/api/java/lang/System.html#getenv-java.lang.String-

如果您想要操作系统不可知的方式,则可以使用JVM参数并使用读取

System.getProperties();

例如,如果要传递名为var1的变量,请使用java -Dvar1=true -jar myJar.jar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM