有可能傻瓜"从命令行设置环境变量的java

时间:2015-07-08 21:54:45

标签: java jvm-arguments jvm-languages

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

我想设置环境变量。是否有另一种方式来愚弄"傻瓜"设置了环境变量的java,例如使用-D参数?

(我通过hue在oozie中运行spark;所有在Cloudera堆栈中)。

2 个答案:

答案 0 :(得分:4)

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上设置环境变量(请参阅Arnon链接的问题) his commentHow do I set environment variables from Java?)然后使用您的实际JAR调用java。您可以对要设置的环境变量进行硬编码,也可以根据包装器接收的系统属性进行设置。 (或者您甚至可以在Java中实现自己的shell并将脚本传递给它。)

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

答案 1 :(得分:1)

如果您可以运行任意Java代码,则可以使用ProcessBuilder创建和运行Process,包括您选择的环境。

因此,编写一个解析命令行的java程序,如

java -cp .... your.Prog FOO=BAR BAZ=BOOM command arguments ...

并以commandFOO扩展的环境启动BAZ (请注意,command可以是java ...)