如何在OS X上全局设置java系统属性?

短篇故事

我需要一种系统级方法来为所有java调用java.awt.headless属性设置为true 。 也就是说,使用-Djava.awt.headless=true不是一个选项,因为java是从我无法访问的地方调用的(例如来自用Java / C /等编写的另一个工具)。

很长的故事

我正在使用一堆用Java编写的工具(特别是Adobe的Air ADT),这些工具依赖于AWT类。 当我在控制台上运行这些工具时,它们工作正常。 但是当我从SSH会话中运行它们时,它们会失败并出现java.lang.InternalError: Can't connect to window server - not enough permissions 。 谷歌搜索我发现将java.awt.headless设置为true将解决问题。 它没有,这是因为ADT本身在没有 -Djava.awt.headless=true 情况下生成子Java进程。

是否有任何系统级方法来确保在调用Java时设置此属性? 也许一些系统awt属性文件或等价物?

最糟糕的情况我可以尝试使用shell脚本替换/usr/bin/java ,将此参数添加到"$@"但我希望避免这种情况。 (更新:为了确保我的理论是正确的,尝试这个shell脚本破解它确实解决了问题。只是希望有一个更清洁的解决方案)

看起来JAVA_TOOL_OPTIONS环境变量的支持至少被Java 6添加到Sun / Oracle JVM中。它在Java 8文档中有所描述。 我没有测试过,但它似乎也在OpenJDK中 。 这似乎是比其他答案更标准化的解决方案。

我能够解决我遇到的问题:

JAVA_TOOL_OPTIONS=-Djava.awt.headless=true ant ...

这成功地将属性传播到从Ant调用的Gradle构建脚本( ./gradlew )。 相比之下, ant -Djava.awt.headless=true ...没有将属性传播到子ant -Djava.awt.headless=true ... 。 找到最初在github上与Gradle相关的要点中描述的这个解决方案。

使用_JAVA_OPTIONS而不是JAVA_OPTS 。 运行java时, _JAVA_OPTIONS会自动被选中。

 export _JAVA_OPTIONS=-Djava.awt.headless=true adt ... 

我知道在OS X上也是如此。 这表明这可能也适用于Windows和Linux。

似乎没有标准的方法来做到这一点。 这是我能想到的最好的:

  1. /usr/bin/java重命名为/usr/bin/java.ori
  2. 使用755权限创建以下/usr/bin/java替换:

     #!/bin/bash java.ori $JAVAOPT "$@" 

    然后,您可以使用环境变量JAVAOPT来设置全局java选项。 这些也将传播到可能产生的任何java子进程:

     export JAVAOPT=-Djava.awt.headless=true adt ...