是否可以 "fool" java 从命令行设置环境变量

Is it possible to "fool" java that an environment variable is set from the command line

我 运行 在一个可以传递参数但不能使用普通命令行设置环境变量的环境中。

不过我还是想设置环境变量。是否有 "fool" java 的替代方法来设置环境变量,例如使用 -D 参数?

(我 运行 通过 hue 在 oozie 中产生火花;全部在 Cloudera 堆栈中)。

java 命令本身似乎不允许这样做。它有一个 -D 参数,但设置 Java 'system properties':

$ java -help 2>&1 | grep -A1 '\-D' 
    -D<name>=<value>
                  set a system property

Java 系统属性是一种 Java 属性。与环境变量 java properties are key-value pairs 类似,但与环境变量不同:如果您的 Java 应用程序对特定环境变量做出反应,则设置同名系统 属性 不会除非应用程序也明确对此作出反应,否则不会有任何影响 属性。

如果您的环境允许您 运行 任意 Java 应用程序并且如果它允许您的 Java 应用程序执行其他进程,您可以编写一个设置环境变量的小包装器在 ProcessBuilder (see the question Arnon linked in : How do I set environment variables from Java?) 上,然后使用您的实际 JAR 从中调用 java。您可以对要设置的环境变量进行硬编码,也可以根据包装器接收到的系统属性来设置它们。 (或者您甚至可以在 Java 中实现自己的 shell 并将脚本传递给它。)

不过,如果您可以修改该实际 JAR 的源代码,那么 更为惯用的解决方案 将使其本身对属性而不是(或另外对)环境做出反应变量。 (除非您必须控制 java 命令/JVM 响应的环境变量,而不是您想要 运行 响应的 JAR。当然,这种方法将不适用。)

如果您可以 运行 任意 Java 代码,则可以使用 ProcessBuilder 创建并 运行 一个流程,包括您选择的环境。

因此,编写一个 java 程序来解析像

这样的命令行
java -cp .... your.Prog FOO=BAR BAZ=BOOM command arguments ...

并开始 command,环境由 FOOBAZ 扩展 (注意 command 可能是 java ...)