我需要一种系统级方法,为所有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本身产生了儿童Java进程 ,没有 -Djava.awt.headless=true
。
是否有任何系统级方法来确保在调用Java时设置此属性?也许某些系统awt属性文件或等价物?
最糟糕的情况我可以尝试使用将此参数添加到/usr/bin/java
的shell脚本替换"$@"
,但我希望避免这种情况。 (更新:只是为了确保我的理论是正确的,尝试这个shell脚本破解它确实解决了问题。只是希望有一个更清洁的解决方案)
答案 0 :(得分:17)
使用_JAVA_OPTIONS
代替JAVA_OPTS
。运行java时,_JAVA_OPTIONS
会自动被选中。
export _JAVA_OPTIONS=-Djava.awt.headless=true
adt ...
我知道在OS X上也是如此。 This表示这可能也适用于Windows和Linux。
答案 1 :(得分:3)
至少在Java 6中,对{/ 1}}环境变量的支持似乎已添加到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中描述的此解决方案。
答案 2 :(得分:2)
似乎没有标准的方法来做到这一点。这是我能想到的最好的:
/usr/bin/java
重命名为/usr/bin/java.ori
使用755权限创建以下/usr/bin/java
替换:
#!/bin/bash
java.ori $JAVAOPT "$@"
然后,您可以使用环境变量JAVAOPT
来设置全局java选项。这些也将传播到可能产生的任何java子进程:
export JAVAOPT=-Djava.awt.headless=true
adt ...