【问题标题】:Sourcing env variables into Java from a text file, bash-style将环境变量从文本文件中获取到 Java 中,bash 样式
【发布时间】:2012-07-12 12:32:42
【问题描述】:

我有一个 bash 文件(我们称之为 bash_file),其中包含许多环境变量分配(例如 TOOLS_DIR="/opt/tools")以及获取另一个文件(例如 source /opt/other_file)并从环境中构造环境变量的 bash 代码来自 other_file 的变量(例如 NEW_ENV_VAR=$FILEPATH/$FILENAME,其中 FILEPATH 和 FILENAME 在 other_file 中分配)。

我有一个 Java 应用程序,它需要这些环境变量的可见性,但是使用标准的 System.getenv() 并不能获取这些环境变量,因为 bash 文件还没有在 Java 的 shell 中获取。如果我使用Java的Runtime.exec("source bash_file"),那么环境变量只存在于Java的子shell中,即使使用了bash的export命令。

如果我在纯 bash 中,我只需执行我的 source bash_file 并可以访问在 bash_file 中分配的所有环境变量,但在 Java 中并不是那么简单。

我已经想到了几个选项,但没有一个看起来特别优雅:

  1. 在使用source bash_file 命令的同一进程中,将当前env 添加到 .bashprofile 中,以便将来所有运行时 exec 调用都可以使用它,例如 System.getenv()。

    问题:我不能 100% 确定 getenv 是否会在运行时接受添加到 bashprofile 的 env var,并且将所有这些变量全局导出一点都不好.

  2. 再次在与source_bash_file 相同的过程中,将当前env 保存到文本文件中,并使用Java 手动解析。

    问题:这样可以完成工作,但远不如System.getenv() 返回的地图漂亮和优雅。用 Java 编写解析器似乎也很棘手。

  3. 找出 Java 的 bash 环境在哪里实例化(可能在 java.System.lang 中)并修改以执行 source bash_file before 初始化 Java 的环境,因此变量由我的 Java 继承应用程序。

    问题:这似乎是我所有选项中最混乱的一个,我不知道从哪里开始寻找 Java 外壳环境的初始化。

有没有办法从 Java 中执行类似 bash 的 source 操作,或者,获取该功能的最简单实现是什么?在评估可能的行动方案时,我还表达了一些不确定性,如果有人能就这些不确定性告诉我,我将不胜感激。

谢谢!

【问题讨论】:

    标签: java bash environment-variables environment


    【解决方案1】:

    不,没有在 Java 中运行 bash 代码的通用方法。但是通过 shell 脚本调用 Java 程序是很常见的;你确定你的还没有那样工作吗?如果是这样,那是在执行程序之前获取其他 bash 文件的最直接的地方。

    如果由于某种原因这不是一个选项,那么 #2 是最好的解决方案。 #1 和 #3 不好;您不希望仅仅为了能够运行此程序而更改系统范围或帐户范围的设置 - 特别是如果您打算让其他人使用它。

    #2 选项的解析不需要很复杂。只需使用内置的set 或类似的东西输出环境变量,然后在您的Java 解析器中一次读取一行并在每行的第一个= 符号处拆分。如果变量包含换行符,bash 应该将它转义在一个美元引号字符串中,这可能会混淆您的解析,但您可能不需要担心嵌入的换行符,因此将结果视为垃圾。您可能还想取消引用 ''"" 中包含的值,甚至可能在第二种情况下处理反斜杠转义,但在大多数情况下,不需要反斜杠解析。

    【讨论】:

    • 它是 JSF Web 应用程序的一部分,因此调用 Java 应用程序的脚本将位于我的 Tomcat 配置中。
    • 关于您对解析器的建议,我认为存储它的好方法是在 Map 中是否正确,其中 = 之前的位是关键,之后的位这将是价值吗?例如。 VAR_NAME=VAR_VALUEMap<String, String> 中变为 <VAR_NAME, VAR_VALUE>
    • 当然,这将是在 Java 中存储信息的好方法。但我希望您最好的选择可能是更改您的 tomcat 配置,以便它在执行您的程序之前获取您必要的环境位。
    • 现在我想起来了,文件中的值可能会随着时间而改变,所以最好实现#2。但是,如果我选择执行 #3,我不确定在我的 Tomcat 配置中的确切位置我会找到应用程序的调用。我可能需要发布一个新问题来解决这个问题。
    猜你喜欢
    • 2012-01-30
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多