java - 如何从Java(而不是System.properties)读取 "OS variables"

标签 java environment-variables configuration-files system-properties 12factor

我刚刚读了优秀的12 Factor App文件,它确实在我身上注册了。在 Chapter 3 Config ,作者强调:

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.

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

通常,当谈到我的 Java 应用程序时,我认为“环境变量”是我可以从 System.getProperty("blah") 读取的内容。这就是作者所说的吗?我不认为这是这样,因为作者明确指出“并且不像...或其他配置机制,例如 Java System Properties...”。

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

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

最佳答案

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

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

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

JDK 中没有跨平台 API 可以执行此操作,而且我不知道第 3 方库也会因此而终止。我个人计划实现一项,但到目前为止还没有时间。

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

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

关于java - 如何从Java(而不是System.properties)读取 "OS variables",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25036357/

相关文章:

java - 是什么导致我的循环仅在第一次迭代中忽略此 "\t"?

vim - 如何定位vim编辑器使用的vimrc文件?

vim 无法将 <C-Tab> 映射到 :tabnext

Jboss,为应用程序设置环境变量

android - 如何创建属性文件android

java - 如果我更改值,Android 倒计时器不工作

java - 第一个 QT Jambi 应用程序中存在多个运行时异常?

java - 如何创建 OkHttp 所需的虚拟 ResponseBody 对象?

asp.net-core - 使用 IISExpress 时,本地开发机器上未设置 ASP.NET Core 3.1 launchSettings.json 环境变量

java - 在 Maven 配置文件中设置系统变量