Java не может подключиться к оконному серверу X11, используя localhost: 10.0 в качестве значения переменной DISPLAY


97

У меня есть сценарий с использованием java для подключения к отображению X11 в порту 10.0 на localhost

но я всегда получаю эту ошибку

java.lang.InternalError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.
    at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
    at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:62)
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:178)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:142)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
    at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:112)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at java.awt.Toolkit$2.run(Toolkit.java:849)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:841)
    at ij.io.Opener.openJpegOrGif(Opener.java:367)
    at ij.io.Opener.openImage(Opener.java:220)
    at ij.io.Opener.openImage(Opener.java:249)
    at ij.io.Opener.open(Opener.java:116)
    at ij.IJ.open(IJ.java:1112)
    at ij.macro.Functions.open(Functions.java:2006)
    at ij.macro.Functions.doFunction(Functions.java:129)
    at ij.macro.Interpreter.doStatement(Interpreter.java:205)
    at ij.macro.Interpreter.doBlock(Interpreter.java:515)
    at ij.macro.Interpreter.runUserFunction(Interpreter.java:278)
    at ij.macro.Interpreter.getFactor(Interpreter.java:1200)
    at ij.macro.Interpreter.getTerm(Interpreter.java:1162)
    at ij.macro.Interpreter.getExpression(Interpreter.java:1145)
    at ij.macro.Interpreter.getBooleanExpression(Interpreter.java:881)
    at ij.macro.Interpreter.getLogicalExpression(Interpreter.java:857)
    at ij.macro.Interpreter.getBoolean(Interpreter.java:850)
    at ij.macro.Interpreter.doIf(Interpreter.java:829)
    at ij.macro.Interpreter.doStatement(Interpreter.java:217)
    at ij.macro.Interpreter.doBlock(Interpreter.java:515)
    at ij.macro.Interpreter.doStatement(Interpreter.java:241)
    at ij.macro.Interpreter.doIf(Interpreter.java:831)
    at ij.macro.Interpreter.doStatement(Interpreter.java:217)
    at ij.macro.Interpreter.doStatements(Interpreter.java:195)
    at ij.macro.Interpreter.run(Interpreter.java:99)
    at ij.macro.Interpreter.run(Interpreter.java:65)
    at ij.macro.Interpreter.run(Interpreter.java:75)
    at ij.plugin.Macro_Runner.runMacro(Macro_Runner.java:127)
    at ij.plugin.Macro_Runner.runMacroFile(Macro_Runner.java:112)
    at ij.IJ.runMacroFile(IJ.java:103)
    at ij.ImageJ.main(ImageJ.java:517)

Я перепробовал все, чтобы решить эту проблему, например:

export DISPLAY=:10.0
export DISPLAY=localhost:10.0

Я пробовал также порт 0.0, но всегда получаю одну и ту же ошибку

после попытки xhost

xhost +local:all
xhost:  unable to open display ""
xhost:  unable to open display ":10.0"

Как я могу это исправить? Я думал, что X-сервер не работает, поэтому я попробовал, startxон говорит, что он работает на этом порту

моя система - версия сервера Ubuntu 10.04

Ответы:


37

Эта команда помогла мне решить проблему:

export DISPLAY=:0

41
unset DISPLAYпомогло мне (с export DISPLAY=:0ошибкой я получилCan't connect to X11 window server using ':0'
белучин

2
Где ты это поставил
Spektakulatius

1
ну, когда-нибудь - он не будет работать в Linux, тогда хорошо установить Xvfb с apt и запустить его на любом экране, например: Xvfb: 1, а затем установить переменную на этапе сборки - export DISPLAY =: 1 -> это отлично работает.
Панкадж Кумар Катияр

Пожалуйста, прочтите: this stackoverflow.com/questions/20607777/…
Феликс Абалли

Есть ли причина для такого поведения?
Annapoorni D,

61

Вам нужно указать -Djava.awt.headless=trueпараметр при запуске.


Большое спасибо, но где я должен это точно указать?
Elteroooo

1
Исключение в потоке "main" java.awt.He adlessException в java.awt.GraphicsEnvironment.checkHeadless (GraphicsEnvironment.java:1 73)
Elteroooo

Вы работаете с менеджером по безопасности? Если это так, возможно, вам придется предоставить разрешение.
Michael-O

1
спасибо, проблема заключалась в том, что X-сервер работает в другом порту
Elteroooo

1
Программа спрашивающего хочет сделать ij.io.Opener.openJpegOrGif, мы можем догадаться, что для этого, вероятно, требуется графический интерфейс. Так что без головы приведет другую ошибку: java.awt.HeadlessException.
Николас Рауль

41

Удалите переменную DISPLAY

unset DISPLAY

Это помогает в большинстве случаев (например, запуск серверов приложений или других инструментов на основе Java) и позволяет избежать изменения всего этого большого количества командных строк.

Также может быть удобно добавить его в .bash_profile для выделенного пользователя app-server / tools.


1
мне это совсем не помогло. Я получил следующее: AWT не может подключиться к оконному серверу X11, используя ...
Панкадж Кумар Катияр

Если ваше приложение использует awt, вы должны правильно установить DISPLAY. Это для приложений, не использующих awt.
bebbo

Поиграясь с этим, убедитесь, что вы перезапустите mobaXterm после добавления команды unset в ваш файл bash. Поскольку переменная Display будет установлена ​​раньше, и простой запуск вашего файла bash не изменит этого.
mrk 07

17

Я думаю, вы работаете в режиме sudo. Пожалуйста, перейдите в пользовательский режим и попробуйте еще раз


4
Это тоже была моя проблема. Кажется странным, что не может работать как root, правда?
javajavajava

Почему я не могу использовать sudo?
Андреа Боргогелли Авведути

@javajavajava yup
Harsh V Pillai

9

В случае, если кто-то пытается запустить автоматические модульные тесты через maven-surefire-plugin на CI (jenkins, ..) и получает вышеупомянутую ошибку, обязательно обновите конфигурацию вашего плагина surefire:

<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-surefire-plugin</artifactId>
     <version>${maven-surefire-plugin.version}</version>
     <configuration>
            <systemPropertyVariables>
                <java.awt.headless>true</java.awt.headless>
            </systemPropertyVariables>
      </configuration>
</plugin>

1
как это сделать в gradle, а также как установить в нем значение свойства.
Собхит Шарма

8

Это исправит:

/usr/bin/java -Djava.awt.headless=true $Your_program

Мой не исправил
Алексей Шныров

1
Это сработало для меня. Спасибо. Я получаю сообщение об ошибке, потому что использую poi.
dev4life

6

Для меня вход в систему как -Y вместо -X работал.

Если у вас ненадежный X11, как показано ниже, попробуйте вместо этого использовать флаг -Y (если вы доверяете хосту):

Предупреждение : не удалось настроить ненадежную пересылку X11: данные ключа xauth не созданы


5

После нескольких дней бесполезных усилий по установке Glassfish на Raspberry Pi 2 с безголовой Fedora 22, Ниже работал у меня без сучка и задоринки

 unset DISPLAY
java -Djava.awt.headless=true -jar glassfissh-installer-v2ur2-b04-linux.jar

получил мою помощь отсюда


4

Первое: запустите XQuartz

Второй: ssh -X user @ ip_address

...: начать свой процесс

если вы ssh, а затем запустите XQuartz, вы получите эту ошибку


4

Это устранило мою проблему

xhost +

но имейте в виду, что xhost +полностью отключает аутентификацию и позволяет каждому получить доступ ко всем приложениям на вашем экране.

xhost +si:localuser:root похоже, работает аналогично при правильной аутентификации.


3

Сначала сделайте это либо на этапе сборки Jenkins, если используете, либо установите в / etc / profile:

unset DISPLAY
export DISPLAY=:0

затем установите это свойство либо в java-коде, либо с помощью maven: -Djava.awt.headless = false


2

Я использовал Xming и получил аналогичную ошибку. Для решения проблемы были предприняты следующие шаги:

  1. При запуске Xming установите флажок нет контроля доступа.
  2. В шпатлевке выполнялась следующая команда: DISPLAY=XXX.XXX.XXX.XX:0.0; export DISPLAY

Замените XXX.XXX.XXX.XXсвоим IP-адресом.


У меня такая же конфигурация, но это не сработало. Мне нужно было добавить IP, выполняющий X11, в файл X0.hosts
Кристоф Мойн

2

Решено. Я просто выхожу из системы и вхожу в систему с помощью xorg!


1
экспорт DISPLAY =: 0 или экспорт DISPLAY =: 1 у меня не работали. Выход из системы и вход в систему решили эту проблему для меня.
Optimus

2

Если вы пытаетесь экспортировать отображение с помощью su, но это все равно не работает. Это то, что у меня сработало. Попробуйте перенаправление X11 для пользователей sudo.

Подключите удаленный хост с помощью опции -X с ssh.

# ssh -X root@remote-host

Теперь перечислите набор кукол для текущего пользователя.

# xauth list $DISPLAY
    node01.thegeekdiary.com/unix:10  MIT-MAGIC-COOKIE-1  dacbc5765ec54a1d7115a172147866aa
# echo $DSIPLAY
    localhost:10.0

Переключитесь на другую учетную запись пользователя с помощью sudo. Добавьте файл cookie из вывода команды выше пользователю sudo.

# sudo su - [user]
# xauth add node01.thegeekdiary.com/unix:10  MIT-MAGIC-COOKIE-1  dacbc5765ec54a1d7115a172147866aa

Снова экспортируйте отображение из шага 2 для пользователя sudo. Попробуйте выполнить команду xclock, чтобы убедиться, что клиентские приложения x работают должным образом.

# export DISPLAY=localhost:10.0

источник: https://www.thegeekdiary.com/how-to-set-x11-forwarding-export-remote-display-for-users-who-switch-accounts-using-sudo/


1

Если вы видите эту ошибку в Hudson, попробуйте удалить каталог .java из вашего домашнего каталога, это может сработать для вас.


1

Майкл-О дал полезный подход к решению проблемы. Другой способ решить эту проблему - запустить сервер с помощью Putty Console.


не могли бы вы объяснить еще немного, как это будет работать? (Я никогда не использовал шпатлевку)
mrk 07

1

В моем случае на моей машине не осталось места, и я столкнулся с той же проблемой. Иногда это может быть проблема с космосом. Проверьте свободное место в среде Linux / Unix и убедитесь, что на вашем компьютере достаточно места.


1

проверьте, установлена ​​ли переменная $ DISPLAY или нет, с помощью следующей команды:

echo $ DISPLAY

если отображаемая переменная не установлена, запустите приведенную ниже команду, чтобы установить, (даже если она установлена, для вашего сеанса вы можете иметь значение ниже)

экспорт DISPLAY =: 0.0

в замазке также есть расположение отображения x как: 0,0


1

У меня была такая же проблема на сервере Linux, над которым я работал. Подключение java к дисплею X11 работало на головном узле, но не на любом другом. После обращения к администратору выяснилось, что текущая версия нашей системы планирования заданий (SLURM) не поддерживает пересылку X11. Им пришлось обновить SLURM (новые версии SLURM поддерживают его), чтобы он заработал.



0

Я сталкиваюсь с той же ошибкой, что и вы, когда запускаю команду jconsole на удаленном компьютере. Я хочу изменить параметр в jconsole, который работает на удаленном хосте Linux, я могу войти на хост, используя secureCRT, терминал выдает эту информацию об ошибке. К счастью, при использовании Putty все в порядке. Странно ....


0

Если вы запускаете приложение на удаленном сервере при входе в систему по ssh, то другим способом будет запустить ssh с -xпараметром или добавить ForwardX11 noв ваш /etc/ssh/ssh_config. В этом случае ssh не будет создавать переменную окружения DISPLAY.


0

Для меня проблема заключалась в том, что xorg-x11-xauth не был установлен. Я его установил, и все заработало.

Пакеты, которые у меня есть сейчас:

  • libX11-общий-1.6.3-2.el6.noarch
  • libX11-1.6.3-2.el6.i686
  • libX11-1.6.3-2.el6.x86_64
  • xorg-x11-drv-ati-firware-7.6.1-2.el6.noarch
  • xorg-x11-xauth-1.0.9-1.el6.x86_64

0

Если вы запускаете свой код из Jenkins, включение опции «Запускать Xvfb перед сборкой и выключать после» может помочь. Мне это помогло.




0

Для Ubuntu 17.10 Установите виртуальный буфер кадра X (xvfb)

apt install xvfb

И добавил эти строчки в файл / etc / profile ...

# Start the X virtual frame buffer (Xvfb)
if [ -f /usr/X11R6/bin/Xvfb ]; then
/usr/X11R6/bin/Xvfb :1 -screen 0 1366x768x32
fi

# Set the DISPLAY variable for the X virtual frame buffer (Xvfb)
export DISPLAY=localhost:1.0

2
Теперь я просто получаю «Исключение в потоке» main »java.awt.AWTError: Не могу подключиться к оконному серверу X11, используя« localhost: 1.0 »в качестве значения переменной DISPLAY». в Ubuntu 16.04. Бинарный файл Xvfb теперь кажется расположен в / usr / bin, а не / usr / X11R6 / bin, но дает мне сообщение «Не удалось добавить экран 0 (EE)».
Крис Дженкс

0

В моем случае эта ошибка не была связана с портом DISPLAY. Я пытался загрузить XML в Windchill (программное обеспечение PLM) и получил только указанную выше ошибку на терминале. В лог -файле я нашел отчет о том, что мой XML-файл поврежден . Может быть, у кого-то есть похожая проблема, и он может использовать этот ответ.


0

Моя проблема была в брандмауэре. Временно отключил.

[РЕДАКТИРОВАТЬ] И имя хоста сервера указывало на другой IP. Установите просто localserver. strace xclockпомог отладить эту проблему.


0

Я решил эту проблему, выполнив вход с помощью Xorg. По умолчанию я использовал Wayland. Похоже, что Wayland устраняет большинство недостатков дизайна Xorg, у него есть свои проблемы.введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.