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

Posted

技术标签:

【中文标题】如何在 OS X 上全局设置 java 系统属性?【英文标题】:How to set java system properties globally on OS X? 【发布时间】:2012-05-24 12:56:13 【问题描述】:

短篇小说

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

说来话长

我正在使用一堆用 Java 编写的工具(特别是 Adob​​e 的 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 属性文件或等效文件?

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

【问题讨论】:

我想您可以接受您的更新作为有效答案。 【参考方案1】:

使用_JAVA_OPTIONS 而不是JAVA_OPTS_JAVA_OPTIONS 会在你运行 java 时自动获取。

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

我知道这在 OS X 上是正确的。 This 表示这可能也适用于 Windows 和 Linux。

【讨论】:

附加说明 _JAVA_OPTIONS 并没有真正记录在案,因此请谨慎使用。最好检查源代码:jdk7 arguments,jdk8 arguments。请注意,这只是一个 Oracle 热点参数,它不适用于基于其他代码的其他 JVM。 Azul Zulu 应该可以工作,因为它是从 OpenJDK 代码构建的。【参考方案2】:

看起来对 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 中找到了这个解决方案。

【讨论】:

【参考方案3】:

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

    /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 ...
    

【讨论】:

以上是关于如何在 OS X 上全局设置 java 系统属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OS X 10.9 上设置 JAVA_HOME 环境变量?

以编程方式设置 dock:name Java Mac OS X JVM 属性

如何提高Mac OS X下android模拟器运行速度

如何在os x下让sublime text编译c程序

Mac OS X文件系统的附加属性@如何彻底删除

mac OS X:[11]如何添加打印机