11

短篇故事

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

很长的故事

我正在使用一堆用 Java 编写的工具(特别是 Adob​​e 的 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 时设置此属性?也许一些系统awt属性文件或等效文件?

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

4

3 回答 3

19

使用_JAVA_OPTIONS而不是JAVA_OPTS. _JAVA_OPTIONS运行java时会自动获取。

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

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

于 2012-12-12T22:40:13.693 回答
3

看起来对JAVA_TOOL_OPTIONS环境变量的支持至少是由 Java 6 添加到 Sun/Oracle JVM 中的。它在Java 8 文档中有所描述。我还没有测试过,但它似乎也在OpenJDK中。这似乎是比这里的其他答案更标准化的解决方案。

我能够解决我遇到的问题:

JAVA_TOOL_OPTIONS=-Djava.awt.headless=true ant ...

这成功地将属性传播到./gradlew从 Ant 调用的 Gradle 构建脚本 ( )。相比之下ant -Djava.awt.headless=true ...,没有将属性传播到子进程。在 github 上的 Gradle-related gist中找到了这个解决方案。

于 2017-03-31T15:10:18.140 回答
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 ...
    
于 2012-06-06T16:44:10.160 回答