如何在OS X上全局设置java系统属性?
短篇故事
我需要一种系统级方法来为所有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本身在没有 -Djava.awt.headless=true
情况下生成子Java进程。
是否有任何系统级方法来确保在调用Java时设置此属性? 也许一些系统awt属性文件或等价物?
最糟糕的情况我可以尝试使用shell脚本替换/usr/bin/java
,将此参数添加到"$@"
但我希望避免这种情况。 (更新:为了确保我的理论是正确的,尝试这个shell脚本破解它确实解决了问题。只是希望有一个更清洁的解决方案)
看起来JAVA_TOOL_OPTIONS
环境变量的支持至少被Java 6添加到Sun / Oracle JVM中。它在Java 8文档中有所描述。 我没有测试过,但它似乎也在OpenJDK中 。 这似乎是比其他答案更标准化的解决方案。
我能够解决我遇到的问题:
JAVA_TOOL_OPTIONS=-Djava.awt.headless=true ant ...
这成功地将属性传播到从Ant调用的Gradle构建脚本( ./gradlew
)。 相比之下, ant -Djava.awt.headless=true ...
没有将属性传播到子ant -Djava.awt.headless=true ...
。 找到最初在github上与Gradle相关的要点中描述的这个解决方案。
使用_JAVA_OPTIONS
而不是JAVA_OPTS
。 运行java时, _JAVA_OPTIONS
会自动被选中。
export _JAVA_OPTIONS=-Djava.awt.headless=true adt ...
我知道在OS X上也是如此。 这表明这可能也适用于Windows和Linux。
似乎没有标准的方法来做到这一点。 这是我能想到的最好的:
- 将
/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 ...
- ResultSet.getTimestamp(“date”)vs ResultSet.getTimestamp(“date”,Calendar.getInstance(tz))
- 如何确保我的HttpClient 4.1不会泄漏套接字?
- Java中的paintComponent()没有被调用
- 找到与Lucene匹配的开始和结束
- Spring Data + JPA具有多个数据源但只有一组存储库
- Spring安全性:期望只为类型接口找到一个bean org.springframework.security.authentication.AuthenticationManager
- Java ArrayList IndexOutOfBoundsException尽管给出了初始容量
- MimeMessage.saveChanges真的很慢
- 如何使用Java检测替换新类?
- CSS Locator with contains()使用Selenium WebDriver的InvalidSelectorException
- java.sql.SQLException:在mysql结果集结束后