Переменная DISPLAY X11 программы Java для Linux была установлена, но

Я знаю, что это повторяющийся вопрос, но я пока не нашел ответа.

Я на Linux-сервере (Ubuntu 14.04 LTS), и у меня есть java-приложение, которое вызывает другое для выполнения какой-либо операции, первое работает без проблем, но второе использует графический интерфейс, и когда я вызываю его, я получаю печально известную ошибка «Переменная X11 DISPLAY не была установлена, но эта программа выполнила операцию, для которой она требуется». У меня уже запущен экземпляр Xvfb, и я экспортировал DISPLAY.

Xvfb :99 &
export DISPLAY=:99

If I do

echo $DISPLAY

я получаю :99

Я могу запустить вызываемое java-приложение из командной строки, и оно работает, но когда его вызывает другое java-приложение, оно не работает. Почему он не «видит» переменную DISPLAY, когда я вызываю банку из другого приложения Java? И как мне это исправить?

ПРИМЕЧАНИЕ. Я использую ProcessBuilder для вызова.


person GmodCake    schedule 06.03.2015    source источник
comment
Вам вообще нужен дисплей? Если нет, вы можете запустить JVM с помощью -Djava.awt.headless=true   -  person fge    schedule 06.03.2015
comment
Нет, мне не нужно видеть дисплей, но это нужно приложению (плохо закодировано), и запуск его с -Djava.awt.headless=true тоже не работает.   -  person GmodCake    schedule 06.03.2015
comment
Если вы не очистите его, ProcessBulder передаст среду вызывающего объекта вызываемому процессу.   -  person stark    schedule 06.03.2015
comment
Что ты имеешь в виду ? Они в одной среде   -  person GmodCake    schedule 06.03.2015
comment
Можно поточнее насчет не работает?   -  person fge    schedule 06.03.2015
comment
Я получаю это: Исключение в потоке main java.lang.ExceptionInInitializerError в com.prodevcoind.myapp.gui.MainDesktop.main(MainDesktop.java:198) Вызвано: java.awt.HeadlessException   -  person GmodCake    schedule 06.03.2015


Ответы (2)


Поскольку вы используете ProcessBuilder и вам не нужен дисплей, вы можете попробовать сделать это перед тем, как .start() начнете процесс:

pb.environment().remove("DISPLAY");

Да, правильно, environment() возвращает представление для чтения и записи переменных среды процесса...

person fge    schedule 06.03.2015

Итак, это фактически решило проблему:

processBuilder.environment().put("DISPLAY", ":99");

person GmodCake    schedule 06.03.2015