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

Bla*_*nka 10 java air headless

短篇故事

我需要一种系统级方法java.awt.headlesstrue 为所有java调用设置属性.也就是说,使用-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本身不会 产生儿童Java进程-Djava.awt.headless=true.

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

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

Bit*_*Man 17

_JAVA_OPTIONS而不是JAVA_OPTS. _JAVA_OPTIONS将在运行java时自动获取.

export _JAVA_OPTIONS=-Djava.awt.headless=true
adt ... 
Run Code Online (Sandbox Code Playgroud)

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


neu*_*mer 4

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

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

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

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