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

11

简短故事

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

长故事

我正在使用一堆使用AWT类的Java工具(具体来说是Adobe的Air ADT)。当我在控制台上运行这些工具时,它们可以正常工作。但是,当我从SSH会话中运行它们时,它们会失败,并出现java.lang.InternalError: Can't connect to window server - not enough permissions错误。在Google上搜索后,我发现将java.awt.headless设置为true可以解决问题。但实际上并没有,因为ADT本身会生成子Java进程,而这些进程没有使用-Djava.awt.headless=true参数。

是否有任何系统级方法可以确保每次调用Java时都设置了此属性?也许有某个系统awt属性文件或等效文件吗?

最坏的情况是,我可以尝试用一个shell脚本替换/usr/bin/java,并将此参数添加到"$@"中,但我希望避免这样做。(更新:为了确保我的理论是正确的,我尝试了这个shell脚本黑客并且它确实解决了问题。只是希望有一个更干净的解决方案)


我想你可以将你的更新作为一个有效的答案接受。 - Zecas
3个回答

20

请使用_JAVA_OPTIONS代替 JAVA_OPTS。在运行Java时,_JAVA_OPTIONS会自动获取。

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

我知道这在OS X上是正确的。 这篇文章表明这也可能在Windows和Linux上起作用。


附加说明:_JAVA_OPTIONS并没有真正的文档,因此请谨慎使用。最好查看源代码:jdk7参数jdk8参数。请注意,这仅适用于Oracle热点虚拟机,对于其他基于不同代码的JVM将无效。Azul Zulu应该可以正常工作,因为它是基于OpenJDK代码构建的。 - bric3

4
看起来至少在Java 6中,Sun/Oracle JVM支持JAVA_TOOL_OPTIONS环境变量。该功能在Java 8文档中有描述。虽然我没有测试过,但它似乎也存在于OpenJDK中。这似乎是比其他答案更标准化的解决方案。
我成功地通过以下方法解决了遇到的问题:
JAVA_TOOL_OPTIONS=-Djava.awt.headless=true ant ...
这将属性传播到从Ant调用的Gradle构建脚本(./gradlew)中。相比之下,ant -Djava.awt.headless=true ...无法将属性传播到子进程中。这个解决方法最初是在github上与Gradle相关的gist中描述的。

2
似乎没有一种标准方法来完成这项任务。这是我能想到的最佳解决方案:
  1. Rename /usr/bin/java to /usr/bin/java.ori
  2. Create the following /usr/bin/java replacement with 755 permissions:

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

    Then you can use the environment variable JAVAOPT to set global java options. These will also be propagated to any java subprocess that may be spawned:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接