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

短篇故事

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

很长的故事

我正在使用一堆依靠AWT类编写的工具(特别是Adobe的Air ADT).当我在控制台上运行这些工具时,它们工作正常.但是当我从SSH会话中运行它们时,它们会以java.lang.InternalError失败:无法连接到窗口服务器 – 没有足够的权限. Googling在我发现,将java.awt.headless设置为true将会解决问题.它没有,这是因为ADT本身产生孩子Java进程没有-Djava.awt.headless = true.

是否有任何系统级的方式来确保在调用Java时设置此属性?也许一些系统的awt属性文件或等效文件

最糟糕的情况我可以尝试将/usr/bin/java替换为一个shell脚本,将此参数添加到“$@”,但我希望避免这种情况. (更新:为了确保我的理论是正确的,尝试这个shell脚本,并且它解决了这个问题,只是希望有一个更清洁的解决方案)

解决方法

它似乎支持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中描述.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...