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

时间:2012-05-16 22:04:18

标签: java air headless

短篇小说

我需要一种系统级方法,为所有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脚本破解它确实解决了问题。只是希望有一个更清洁的解决方案)

3 个答案:

答案 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)

似乎没有标准的方法来做到这一点。这是我能想到的最好的:

  1. /usr/bin/java重命名为/usr/bin/java.ori
  2. 使用755权限创建以下/usr/bin/java替换:

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

    然后,您可以使用环境变量JAVAOPT来设置全局java选项。这些也将传播到可能产生的任何java子进程:

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