[英]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.