有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jvm参数是否可能“愚弄”java从命令行设置环境变量

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

尽管如此,我还是希望设置环境变量。是否有另一种方法可以“愚弄”java设置环境变量,例如使用-D参数

(我正在通过色调运行oozie中的spark;全部在Cloudera堆栈中)


共 (2) 个答案

  1. # 1 楼答案

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

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

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

    并以{}和{}扩展的环境开始{} (注意command可以是java…)

  2. # 2 楼答案

    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应用程序执行其他进程,那么您可以编写一个小包装器,在^{}(请参阅his commentHow do I set environment variables from Java?中链接的问题Arnon)上设置环境变量,然后从中使用实际JAR调用java。您可以硬编码要设置的环境变量,也可以根据包装器接收的系统属性设置它们。(或者您甚至可以用Java实现自己的shell并向其传递脚本。)

    尽管如此,如果您可以修改实际JAR的源代码,一个更为惯用的解决方案是让它自己对属性而不是(或另外)环境变量做出反应。(除非您必须控制java命令/JVM响应的环境变量,而不是您想要运行的JAR,否则这种方法当然不适用。)