0

I just read the excellent 12 Factor App document and it really registered with me. In Chapter 3 Config, the author stresses that:

The twelve-factor app stores config in environment variables (often shortened to env vars or env). Env vars are easy to change between deploys without changing any code; unlike config files, there is little chance of them being checked into the code repo accidentally; and unlike custom config files, or other config mechanisms such as Java System Properties, they are a language- and OS-agnostic standard.

I'm wondering what this implies for Java projects.

Typically, when it comes to my Java apps, I think of "env vars" as things that I can read from System.getProperty("blah"). Is this what the author is talking about? I don't think this is, because the author explicitly states "and unlike...or other config mechanisms such as Java System Properties...".

If not, what would be an example of an OS-agnostic "env var" that would satisfy this document's definition of "env var"? How would I read it from inside Java code?

Either way, some process has to first set each env var on the OS, so that the var is set & available by the time the app runs. What processes/methods could do this type of pre-run setup?

4

2 回答 2

2

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

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

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

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

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

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

于 2014-07-30T12:09:55.360 回答
1

是的,作者说的是环境变量。您可以使用以下代码段从 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

于 2014-07-30T12:10:53.200 回答