Java не вдається підключитися до віконного сервера X11, використовуючи 'localhost: 10.0' як значення змінної DISPLAY


93

У мене є сценарій за допомогою 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

Відповіді:


35

Ця команда допомогла мені вирішити проблему:

export DISPLAY=:0

40
unset DISPLAYмені допомогли (з export DISPLAY=:0я отримав помилкуCan't connect to X11 window server using ':0'
beluchin

1
Де ти це поклав
Спектакулатіус,

1
ну колись - це не буде працювати в linux, тоді добре встановити Xvfb з apt і запустити його на будь-якому екрані, наприклад: Xvfb: 1, а потім встановити змінну на етапі побудови - експортувати DISPLAY =: 1 -> це чудово працює.
Панкадж Кумар Катіяр

Будь ласка, прочитайте: цей stackoverflow.com/questions/20607777 / ...
Фелікс Aballi

57

Вам потрібно вказати -Djava.awt.headless=trueпараметр під час запуску.


Велике спасибі, але де я повинен точно вказати це?
Elteroooo

1
Виняток у потоці "main" java.awt.He adlessException at java.awt.GraphicsEnvironment.checkHeadless (GraphicsEnvironment.java:1 73)
Elteroooo

Ви керуєте менеджером безпеки? Якщо так, можливо, вам доведеться надати дозвіл.
Michael-O,

1
дякую, проблема полягала в тому, що X-сервер працює в іншому порту
Elteroooo

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

40

Видаліть змінну DISPLAY

unset DISPLAY

Це допомагає у більшості випадків (наприклад, запуск серверів додатків чи інших інструментів, заснованих на Java), і дозволяє уникнути модифікації всіх багатьох командних рядків.

Також може бути зручно додати його у файл .bash_profile для спеціального користувача сервер додатків / інструментів.


1
це мені зовсім не допомогло. Я зрозумів: AWT не вдається підключитися до віконного сервера X11 за допомогою ...
Pankaj Kumar Katiyar

Якщо у вашому додатку використовується awt, ви повинні правильно встановити DISPLAY. Це для додатків, які не використовують awt.
bebbo

Граючись із цим, переконайтеся, що ви перезапустили mobaXterm після додавання команди unset у ваш файл bash. Оскільки змінна Display буде встановлена ​​раніше, і лише запуск вашого файлу bash це не змінить.
mrk

15

Думаю, ви працюєте в режимі sudo. Будь ласка, перейдіть до користувацького режиму та повторіть спробу


4
Це була і моя проблема. Здається дивним, що він не може працювати як root, правда?
javajavajava

Чому я не можу використовувати судо?
Андреа Боргогеллі Авведуті,

@javajavajava yup
Harsh V Pillai

9

У випадку, якщо хтось намагається запустити автоматизовані модульні тести через плагін maven-surefire на 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, а також як встановити значення властивості в ньому.
Собхіт Шарма

7

Це виправить:

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


1
Це спрацювало для мене. Дякую. Я отримував помилку, оскільки використовую poi.
dev4life

6

Для мене вхід як -Y замість -X спрацював.

Якщо у вас є ненадійний X11, як показано нижче, спробуйте замість цього прапор -Y (якщо ви довіряєте хосту):

Попередження : невдале налаштування переадресації X11 не вдалося: дані ключа xauth не генеруються


4

Після кількох днів марних зусиль встановлення скляної рибки на малиновий пі 2 з безголовою федорою 22, Нижче працював у мене без проблем

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

отримав мою допомогу звідси


3

Перший: запустіть XQuartz

Друге: ssh -X user @ ip_address

...: розпочніть процес

якщо ви ssh, а потім запустите XQuartz, ви отримаєте цю помилку


3

Це вирішило мою проблему

xhost +

але майте на увазі, що xhost +повністю деактивує автентифікацію та дозволяє всім отримати доступ до всіх програм на вашому екрані.

xhost +si:localuser:root схоже працює подібним чином при правильній автентифікації.


2

Я використовував Xming і отримав подібну помилку. Для вирішення проблеми були вжиті такі кроки:

  1. У запуску Xming поставте прапорець проти контролю доступу.
  2. У шпаклівці виконана наступна команда: DISPLAY=XXX.XXX.XXX.XX:0.0; export DISPLAY

Замініть XXX.XXX.XXX.XXсвою IP-адресу.


Я в тій же конфігурації, проте це не спрацювало. Мені потрібно було додати IP, що виконує X11, у файлі X0.hosts
Крістоф Мойн,

2

Спочатку зробіть це або у Фазі збірки Дженкінса, якщо ви використовуєте або встановили в / etc / profile:

unset DISPLAY
export DISPLAY=:0

потім встановіть цю властивість або в коді Java, або за допомогою maven: -Djava.awt.headless = false


2

Вирішено. Я просто виходжу з системи і ввійду за допомогою xorg!


1
експортувати DISPLAY =: 0 або експортувати DISPLAY =: 1 у мене не працювало. Вихід із системи та вхід у систему вирішили це для мене.
Оптимус

1

Майкл-О дав корисний підхід для вирішення проблеми. Інший спосіб вирішити це - запуск сервера за допомогою Putty Console.


Ви можете пояснити трохи більше, як це могло б працювати? (Я ніколи не використовував шпаклівку)
mrk

1

У моєму випадку в моїй машині не залишилось місця, і я зіткнувся з тією ж проблемою. Інколи це може бути космічною проблемою. Перевірте простір у вашому середовищі Linux / Unix і переконайтеся, що на вашій машині достатньо місця.


1

Якщо ви намагаєтесь експортувати дисплей за допомогою su, але він все ще не працює. Це те, що мені вдалося. Спробуйте переадресацію X11 для користувачів sudo.

Підключіть віддалений хост за допомогою параметра -X за допомогою ssh.

# ssh -X root@remote-host

Тепер перелічіть набір файлів cookie для поточного користувача.

# 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

перевірте, чи встановлено змінну $ DISPLAY, за допомогою команди нижче:

echo $ DISPLAY

якщо змінну відображення не встановлено, запустіть команду нижче, щоб встановити, (навіть якщо вона встановлена, ви можете мати менше однієї для сеансу)

експортувати ДИСПЛЕЙ =: 0,0

у шпаклівці також мають x місце розташування дисплея як: 0,0



0

Я натрапляю на ту ж помилку з вами, коли запускаю команду jconsole на віддаленому. Я хочу змінити параметр на jconsole, який працює на віддаленому хості Linux, я можу ввійти в хост за допомогою secureCRT, термінал видає цю інформацію про помилку. На щастя, при використанні шпаклівки це нормально. Дивно ....


0

Якщо ви бачите цю помилку в Гудзоні, спробуйте видалити каталог .java з домашнього каталогу, це може працювати для вас.


0

Якщо ви запускаєте програму на віддаленому сервері під час входу в систему ssh, тоді іншим способом буде запуск ssh з -xпараметром або додавання ForwardX11 noвашого /etc/ssh/ssh_config. У цьому випадку ssh не створить змінну середовища DISPLAY.


0

Якщо ви запускаєте свій код від Дженкінса, може допомогти ввімкнення опції "Запустити 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)".
Chris Jenks,

0

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


0

Моя проблема була з брандмауером. Тимчасово вимкнув його.

[EDIT] І, ім’я хосту сервера вказувало на інший IP. Встановіть його просто локальний сервер. strace xclockдопоміг налагодити це питання.


0

Я вирішив цю проблему, увійшовши за допомогою Xorg. За замовчуванням я використовував Wayland. Схоже, Wayland усуває більшість конструктивних недоліків Xorg, у нього є свої проблеми.введіть тут опис зображення


-1

Для мене проблема полягала в тому, що xorg-x11-xauth не був встановлений. Я встановив його, і тоді він спрацював.

Зараз я маю такі пакети:

  • libX11-common-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-firmware-7.6.1-2.el6.noarch
  • xorg-x11-xauth-1.0.9-1.el6.x86_64
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.