В настоящее время я работаю над проектом, который требует 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
Странно то, что он работает, когда я делаю это с моего терминала 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 может сделать это …
Других решений пока нет …