能否通过命令行"欺骗"Java环境变量已被设置?

4

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

尽管如此,我仍想设置环境变量。是否有另一种方法“欺骗”Java已经设置了环境变量,例如使用-D参数?

(我正在通过Hue在Oozie中运行Spark;所有这些都在Cloudera堆栈中。)


当你说“使用普通命令行设置环境变量”时,是指在当前进程中运行命令来设置它们吗?还是指你无法全局设置它们?或者其他什么意思?环境变量与命令行正交,所以我无法理解你的限制是什么。 - jpmc26
2
如果您可以控制命令行,您可以像这样设置环境变量:FOO=bar java .... - Buddy
@Buddy,我做不到。这就是这个问题的全部基础。 - Marcin
似乎是重复的问题,与https://dev59.com/nnRC5IYBdhLWcg3wXP0C相同。 - Arnon Rotem-Gal-Oz
@jpmc26 谢谢,我正在使用Cloudera堆栈。然而,那是堆栈的另一个部分。我特别询问通过工作流管理器oozie启动作业的问题。 - Marcin
显示剩余5条评论
2个回答

6
< p > java 命令本身似乎不允许这样。它有一个 -D 参数,但是它设置了 Java '系统属性':

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

Java系统属性是一种Java属性。与环境变量类似,Java属性是键值对,但不同于环境变量:如果您的Java应用程序响应特定环境变量,则设置具有相同名称的系统属性将不会产生任何效果,除非该应用程序也明确响应该属性。
如果您的环境允许您运行任意Java应用程序,并且允许您的Java应用程序执行其他进程,那么您可以编写一个小包装器,在ProcessBuilder上设置环境变量(请参见Arnon在他的评论中链接的问题:如何从Java设置环境变量?),然后使用实际的JAR从中调用java。您可以将环境变量硬编码设置,也可以根据包装器接收到的系统属性进行设置。(或者您甚至可以使用Java实现自己的shell并将脚本传递给它。)

如果您可以修改该JAR实际源代码,则更符合习惯的解决方案是使其自身对属性做出反应,而不是(或者除了)环境变量。(当然,除非您必须控制Java命令/ JVM有反应的环境变量,而不是要运行的JAR。)


谢谢。我会尝试这个。 - Marcin

0
如果你可以运行任意的Java代码,你可以使用ProcessBuilder创建和运行一个进程,包括你选择的环境。
因此,编写一个Java程序来解析类似命令行的输入。
java -cp .... your.Prog FOO=BAR BAZ=BOOM command arguments ...

并使用扩展了 FOOBAZ 的环境启动 command(注意,command 可能是 java ...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接