Java не может подключиться к серверу X11 при выполнении файла JAR из переполнения стека

В настоящее время я работаю над проектом, который требует Java-программы для запуска на сервере Ubuntu. Этот файл Java должен быть активирован php. Проблема в том, что когда я делаю это, используя эту строку кода:

shell_exec("java -jar /opt/lampp/htdocs/java/javafile.jar PARAMETERS");

Это не работает и выдает ошибку ниже. Странно то, что он работает, когда я делаю это с моего терминала Ubuntu (без использования php) или в Windows 10 (используя php).

Я уже пытался добавить это между ‘java’ и ‘-jar’:

-Djava.awt.headless=true

но это дает следующую ошибку и поэтому не работает:

Exception in thread "main" java.awt.HeadlessException at java.awt.Desktop.getDesktop(Desktop.java:142) at com.HotkeyCodeInc.Main.main(Main.java:56)

Это потому, что я использую функцию Desktop, и для этого нужен сервер X11.

Ошибка:

Вы можете проверить ошибку самостоятельно по адресу: http://hotkeycode.biz.tm/java/executejava.php

No protocol specified Exception in thread "main" java.awt.AWTError: Can't
connect to X11 window server using ':0' as the value of the DISPLAY
variable. at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method) at
sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65) at
sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115) at
java.security.AccessController.doPrivileged(Native Method) at
sun.awt.X11GraphicsEnvironment.(X11GraphicsEnvironment.java:74) at
java.lang.Class.forName0(Native Method) at
java.lang.Class.forName(Class.java:264) at
java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103) at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82) at sun.awt.X11.XToolkit.(XToolkit.java:126) at
java.lang.Class.forName0(Native Method) at
java.lang.Class.forName(Class.java:264) at
java.awt.Toolkit$2.run(Toolkit.java:860) at
java.awt.Toolkit$2.run(Toolkit.java:855) at
java.security.AccessController.doPrivileged(Native Method) at
java.awt.Toolkit.getDefaultToolkit(Toolkit.java:854) at
java.awt.Desktop.isDesktopSupported(Desktop.java:169) at
java.awt.Desktop.getDesktop(Desktop.java:143) at
com.HotkeyCodeInc.Main.main(Main.java:56)

Информация о ПК

Ubuntu 17.04

XAMPP (как сервер)

Apache2

PHP 7.1.8

0

Решение

Странно то, что он работает, когда я делаю это с моего терминала Ubuntu (без использования php) или в Windows 10 (используя php).

Я новичок в Java, можете ли вы объяснить, как это сделать?

Я думаю, что самое важное — понять разницу между графическим интерфейсом в Windows и графическим интерфейсом в Linux:

В Windows графический интерфейс является частью операционной системы. Если какая-то программа (например, текстовый редактор) создает окно, текстовый редактор говорит Windows открыть окно. Если вы щелкнете мышью по окну, Windows сообщит текстовому редактору, что в окне был щелчок мышью.

Linux не имеет встроенного графического интерфейса. Вместо этого есть специальная программа под названием «X-сервер» или «X11-сервер», которая предоставляет графический интерфейс: если текстовый редактор создает окно, он отправляет сообщение «создать окно» на сервер X11; если вы нажмете мышь, сервер X11 отправит сообщение «нажата мышь» обратно в текстовый редактор.

Поскольку Linux является многопользовательской ОС, она различает GUI, который вы используете, и GUI, используемый Apache. Поскольку Apache не использует GUI, Java-программа (запущенная косвенно Apache) завершится сбоем, поскольку GUI недоступен.

Это потому, что я использую функцию рабочего стола …

В обоих случаях (Windows и Linux) ваша Java-программа будет ТОЛЬКО уметь взаимодействовать с графическим интерфейсом, на котором работает веб-сервер.

Другими словами:

Когда ваш веб-сервер работает на одном ПК, а ваш веб-браузер работает на другом ПК, Java-программа будет обращаться к графическому интерфейсу ПК, на котором работает веб-сервер, а не к графическому интерфейсу ПК, на котором работает веб-браузер!

Вы действительно уверены, что хотите это сделать?

Некоторые пояснения по поводу комментария Алираби:

Возможно ли переадресовать ваши запросы X11 на ваш локальный компьютер?

Система X11 позволяет запускать «сервер X11» на компьютере, к которому подключены дисплей, клавиатура и мышь, когда текстовый редактор (или любой другой) работает на более мощном компьютере, например на веб-сервере.

Эта концепция похожа на «облачные» текстовые редакторы на основе веб-браузера, где текстовый редактор работает на каком-либо веб-сервере, и только локальный браузер работает на вашем локальном компьютере.

Так что вы мог установить графический интерфейс X11 на компьютер, на котором работает веб-браузер, и настроить Apache таким образом, чтобы этот графический интерфейс «использовался Apache» …

Однако я сомневаюсь, что человек без большого знания X11 может сделать это …

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]