如何在 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 编写的工具(特别是 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 属性文件或等效文件?
在最坏的情况下,我可以尝试用一个将这个参数添加到"$@"
的 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 环境变量?