How to set java system properties globally on OS X

2019-03-26 04:03发布

Short story

I need a system level way to set the java.awt.headless property to true for all java invocations. That is, using -Djava.awt.headless=true is not an option, since java is being invoked from places I don't have access to (e.g. from within another tool written in Java/C/etc.)

Long story

I'm using a bunch of tools written in Java (specifically Adobe's Air ADT) that rely on AWT classes. When I run these tools on the console they work fine. But when I run them from an SSH session they fail with java.lang.InternalError: Can't connect to window server - not enough permissions. Googling around I found that setting java.awt.headless to true will fix the problem. It doesn't, and that's because ADT itself spawns children Java processes without -Djava.awt.headless=true.

Is there any system-level way to ensure this property is set whenever Java is invoked? Maybe some system awt property file or equivalent?

Worst case scenario I could try replacing /usr/bin/java with a shell script that adds this argument to "$@" but I'm hoping to avoid that. (Update: Just to ensure my theory is right, tried this shell script hack and it does solve the problem. Just hoping for a cleaner solution)

3条回答
叼着烟拽天下
2楼-- · 2019-03-26 04:34

Use _JAVA_OPTIONS instead of JAVA_OPTS. _JAVA_OPTIONS will get picked up automatically when you run java.

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

I know this is true on OS X. This indicates that this may work on Windows and Linux, as well.

查看更多
啃猪蹄的小仙女
3楼-- · 2019-03-26 04:51

It looks like support for JAVA_TOOL_OPTIONS environment variable was added to the Sun/Oracle JVM at least by Java 6. It is described in Java 8 documentation. I haven't tested but it appears to be in the OpenJDK too. This appears to be a more standardized solution than the other answers here.

I was able to solve the issue I encountered with:

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

This successfully propagated the property to Gradle build scripts (./gradlew) called from Ant. By comparison ant -Djava.awt.headless=true ... did not propagate the property to subprocesses. Found this solution originally described in a Gradle-related gist on github.

查看更多
爷的心禁止访问
4楼-- · 2019-03-26 04:52

Seems there's no standard way to do this. This is the best I could come up with:

  1. Rename /usr/bin/java to /usr/bin/java.ori
  2. Create the following /usr/bin/java replacement with 755 permissions:

    #!/bin/bash
    java.ori $JAVAOPT "$@"
    

    Then you can use the environment variable JAVAOPT to set global java options. These will also be propagated to any java subprocess that may be spawned:

    export JAVAOPT=-Djava.awt.headless=true
    adt ...
    
查看更多
登录 后发表回答