短篇故事

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

很长的故事

我正在使用一堆用Java编写的工具(特别是Adobe的Air ADT),这些工具依赖于AWT类。当我在控制台上运行这些工具时,它们可以正常工作。但是,当我从SSH session 运行它们时,它们会失败并显示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脚本破解,它确实解决了问题。只是希望有一个更清洁的解决方案)

最佳答案

至少Java 6似乎已将对JAVA_TOOL_OPTIONS环境变量的支持添加到Sun/Oracle JVM中。在Java 8 documentation中进行了描述。我尚未测试,但似乎在OpenJDK too中。与这里的其他答案相比,这似乎是一种更加标准化的解决方案。

我能够解决遇到的问题:
JAVA_TOOL_OPTIONS=-Djava.awt.headless=true ant ...
这成功地将该属性传播到了从Ant调用的Gradle构建脚本(./gradlew)。相比之下,ant -Djava.awt.headless=true ...并未将属性传播到子流程。找到了最初在a Gradle-related gist on github中描述的解决方案。

09-10 03:30
查看更多