短篇故事
我需要一个系统级的方法来将java.awt.headless属性设置为所有java调用的true.也就是说,使用-Djava.awt.headless = true不是一个选项,因为正在从我无法访问的地方(例如从另一个使用Java / C / etc编写的工具)中调用java.
很长的故事
我正在使用一堆依靠AWT类编写的工具(特别是Adobe的Air ADT).当我在控制台上运行这些工具时,它们工作正常.但是当我从SSH会话中运行它们时,它们会以java.lang.InternalError失败:无法连接到窗口服务器 – 没有足够的权限. Googling在我发现,将java.awt.headless设置为true将会解决问题.它没有,这是因为ADT本身产生孩子Java进程没有-Djava.awt.headless = true.
是否有任何系统级的方式来确保在调用Java时设置此属性?也许一些系统的awt属性文件或等效文件?
最糟糕的情况我可以尝试将/usr/bin/java替换为一个shell脚本,将此参数添加到“$@”,但我希望避免这种情况. (更新:为了确保我的理论是正确的,尝试这个shell脚本,并且它解决了这个问题,只是希望有一个更清洁的解决方案)
解决方法
它似乎支持JAVA_TOOL_OPTIONS环境变量至少由Java 6添加到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中描述.