Вопрос или проблема
Когда я пытаюсь запустить Java GUI приложение из командной строки, я получаю:
Исключение в потоке "main" java.awt.HeadlessException:
"Переменная X11 DISPLAY не была установлена,
или поддержка headful библиотек не обнаружена,
но эта программа выполнила операцию, требующую её,"
Я продолжаю получать эту ошибку, всякий раз, когда пытаюсь запустить код с компонентами GUI java.swing
.
$DISPLAY
установлен на :0
, а java --version
дает мне openjdk 19.0.1
.
правка:
Я пытался запустить java Main как с wayland, так и с xorg, но получаю ту же ошибку.
Откат на openjdk-17 сработал для меня, возможно, вы сможете обойтись более новой версией. Openjdk 19 по умолчанию запускается в headless режиме, поэтому отображение отсутствует.
Ответ или решение
Когда вы сталкиваетесь с ошибкой, связанной с переменной окружения X11 DISPLAY при запуске Java GUI-приложений, это может быть довольно неприятной проблемой. Ошибка, которую вы видите:
Exception in thread "main" java.awt.HeadlessException:
"No X11 DISPLAY variable was set,
or no headful library support was found,
but this program performed an operation which requires it,"
указывает на то, что ваша Java-программа пытается выполнить графическую операцию, но окружение, в котором она запущена, не поддерживает графический интерфейс. Давайте рассмотрим эту проблему более детально и выясним, как ее решить.
1. Понимание переменной окружения DISPLAY
Переменная окружения DISPLAY
указывает на сервер X, который отвечает за обработку графических изображений в Unix-подобных операционных системах. Если вы видите сообщение о том, что переменная DISPLAY
не установлена или недоступна, ваша программа не может получить доступ к графическому интерфейсу.
2. Проверка установленной версии Java
Как вы упомянули, вы используете OpenJDK 19. Эта версия Java начинает работать в режиме «headless» по умолчанию, что означает, что она не будет загружать поддержку графического интерфейса, если не указано иное.
3. Возможные решения проблемы
a. Установка X-сервера
Убедитесь, что X-сервер запущен на вашей системе. Вы можете проверить это с помощью команды ps aux | grep X
. Если он не запущен, вам следует его запустить.
b. Проверка переменной DISPLAY
Выполняя команду echo $DISPLAY
, вы получили :0
, что указывает на первый экран дисплея. Убедитесь, что вы выполняете команду в том же сеансе, где запущен X-сервер. Если вы работаете через SSH, возможно, вам потребуется использовать параметр -X
для включения перенаправления X11.
c. Установка переменной HEADLESS
Вы можете запустить ваше приложение с параметром, запрещающим режим headless. Используйте:
java -Djava.awt.headless=false -jar ваш_файл.jar
Это укажет Java не активировать режим безголовья.
d. Понижение версии Java
Как вы уже заметили, возврат к OpenJDK 17 помогает. Это происходит потому, что в этой версии по умолчанию поддерживается графический интерфейс. Если вам не нужны новые функции общения, возможно, лучше оставить версию OpenJDK 17.
Заключение
Управление графическим интерфейсом в Java требует правильно настроенного окружения, особенно в случае с переменной DISPLAY. Убедитесь в том, что у вас запущен X-сервер, переменная окружения корректно настроена, и вы используете подходящее окружение для вашей версии Java. Если ни одно из предложенных решений не работает, возможно, стоит рассмотреть возможность использования виртуальной машины с настроенной графической поддержкой или виртуального рабочего стола.
Этот подход не только устранит вашу проблему, но и поможет вам лучше понять, как Java обрабатывает графические интерфейсы, что может оказаться полезным в будущем.