“Переменная X11 DISPLAY не была установлена […]” при использовании java.swing

Вопрос или проблема

Когда я пытаюсь запустить 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 обрабатывает графические интерфейсы, что может оказаться полезным в будущем.

Оцените материал
Добавить комментарий

Капча загружается...