Mar*_*cin 3 java jvm-languages jvm-arguments
我在可以传递参数但不能使用普通命令行设置环境变量的环境中运行。
我还是要设置环境变量。是否有另一种方法可以“愚弄” java设置环境变量,例如使用-D参数?
(我正在通过色调在oozie中运行火花;所有这些都在Cloudera堆栈中)。
该java命令本身似乎不允许这样做。它有一个-D参数,但是设置了Java的“系统属性”:
$ java -help 2>&1 | grep -A1 '\-D'
-D<name>=<value>
set a system property
Run Code Online (Sandbox Code Playgroud)
Java系统属性是一种Java属性。与环境变量一样,java属性是键-值对,但与环境变量不同:如果您的Java应用程序对特定的环境变量有反应,则设置相同名称的系统属性不会产生任何影响,除非应用程序也明确地对该属性做出反应。
如果您的环境允许您运行任意的Java应用程序,并且如果您的环境允许您的Java应用程序执行其他进程,则可以编写一个小的包装程序来设置a上的环境变量ProcessBuilder(请参见Arnon在他的评论中链接的问题:如何设置环境) Java变量),然后java从中调用实际的JAR。您可以硬编码要设置的环境变量,也可以根据包装程序收到的系统属性进行设置。(或者,您甚至可以用Java实现自己的shell并将脚本传递给它。)
但是,如果您可以修改该实际JAR的来源,则更惯用的解决方案是使其本身对属性(而不是环境变量)(或附加地)做出反应。(除非您必须控制Java命令/ JVM响应的环境变量,而不是您要运行的JAR。因此,这种方法当然不适用。)