Вопрос по java – Как установить свойства системы Java глобально на OS X?

10
Short story

Мне нужен системный уровень способ установитьjava.awt.headless собственность наtrue for all java invocations, То есть используя-Djava.awt.headless=true не вариант, так как java вызывается из мест, к которым у меня нет доступа (например, из другого инструмента, написанного на Java / C / и т. д.)

Long story

Я использую набор инструментов, написанных на Java (в частности, Adobe ADT от Adobe), которые используют классы AWT. Когда я запускаю эти инструменты на консоли, они работают нормально. Но когда я запускаю их из сеанса SSH, они терпят неудачу сjava.lang.InternalError: Can't connect to window server - not enough permissions, Погуглив, я обнаружил, что установка java.awt.headless в true решит проблему. Это не так, и это потому, что ADT сам порождает дочерние процессы Javawithout -Djava.awt.headless=true.

Есть ли какой-нибудь системный способ убедиться, что это свойство установлено при каждом вызове Java? Может быть, какой-нибудь системный файл свойств awt или аналогичный?

В худшем случае я мог бы попробовать заменить/usr/bin/java с помощью сценария оболочки, который добавляет этот аргумент"[email protected]" но я надеюсь этого избежать. (Обновление: просто чтобы убедиться, что моя теория верна, попытался взломать этот скрипт и он решил проблему. Просто надеясь на более чистое решение)

Я думаю, вы можете принять ваше обновление в качестве действительного ответа. Zecas

Ваш Ответ

3   ответа
17

использование_JAVA_OPTIONS вместоJAVA_OPTS. _JAVA_OPTIONS будет поднят автоматически при запуске Java.

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

Я знаю, что это правда на OS X. это указывает, что это может работать и в Windows, и в Linux.

Error: User Rate Limit Exceeded_JAVA_OPTIONSError: User Rate Limit Exceededjdk7 arguments, jdk8 argumentsError: User Rate Limit Exceeded
3

Похоже на поддержкуJAVA_TOOL_OPTIONS переменная окружения была добавлена в JVM Sun / Oracle как минимум с помощью Java 6. Она описана вДокументация по Java 8, Я не проверял, но, похоже, вOpenJDK тоже, Похоже, это более стандартизированное решение, чем другие ответы здесь.

Мне удалось решить проблему, с которой я столкнулся:

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

Это успешно распространило свойство в скрипты сборки Gradle (./gradlew) позвонил из Ant. По сравнениюant -Djava.awt.headless=true ... не распространял свойство на подпроцессы. Нашел это решение, первоначально описанное вСвязанный с Gradle Gist на GitHub.

2

Кажется, нет стандартного способа сделать это. Это лучшее, что я мог придумать:

  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 "[email protected]"
    

    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 ...
    

Похожие вопросы