从 php 执行 jar 文件时无法连接到 X11 服务器

Can't connect to X11 server when executing jar file from php

我目前正在做一个项目,需要 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)

这是因为我使用的是桌面功能,需要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.access0(X11GraphicsEnvironment.java:65) at 
sun.awt.X11GraphicsEnvironment.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.run(Toolkit.java:860) at 
java.awt.Toolkit.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 (as server)

Apache2

PHP 7.1.8

The weird thing is, it does work when I do it from my ubuntu terminal (without using php) or on Windows 10 (using php).

I am new to Java, can you explain how to do that?

我认为最重要的是理解Windows中的GUI和Linux中的GUI的区别:

在Windows 中,GUI 是操作系统的一部分。如果某个程序(例如文本编辑器)创建了一个 window,文本编辑器会告诉 Windows 打开一个 window。如果您使用鼠标单击 window Windows 将告诉文本编辑器在 window.

上单击鼠标

Linux 没有内置 GUI。相反,有一个名为“X 服务器”或“X11 服务器”的特殊程序提供了 GUI:如果文本编辑器创建了一个 window,它会向 X11 服务器发送一条消息“create window”;如果您按下鼠标,X11 服务器会向文本编辑器发送一条消息“按下鼠标”。

因为 Linux 是多用户 OS 它会区分您正在使用的 GUI 和 Apache 使用的 GUI。因为 Apache 不使用 GUI,Java 程序(由 Apache 间接启动)将失败,因为没有可用的 GUI。

This is because I am using the Desktop function ...

在这两种情况下(Windows 和 Linux)您的 Java 程序将 能够与网络服务器的 GUI 交互运行正在开启。

换句话说:

当您的 Web 服务器在一台 PC 上 运行ning 并且您的 Web 浏览器在另一台 PC 上 运行ning 时,Java 程序将访问 PC [=62] 的 GUI =]正在使用 Web 服务器,而不是 PC 的 GUI 运行正在使用 Web 浏览器!

您确定要这样做吗?

对alirabie评论的一些解释:

Is it possible for you to forward your X11 requests to your local desktop?

X11 系统允许您在连接了显示器、键盘和鼠标的计算机上 运行 “X11 服务器”,而文本编辑器(或其他)正在 运行 上功能强大的计算机 - 例如网络服务器。

这个概念类似于基于网络浏览器的“云”文本编辑器,其中实际的文本编辑器 运行ning 在某些网络服务器上,只有网络浏览器 运行ning 在您的本地计算机。

因此您可以在计算机上安装 X11 GUI,该计算机正在 运行 网络浏览器并以 Apache 使用该 GUI 的方式配置 Apache “...

但是我怀疑没有很多 X11 知识的人是否能够这样做...