从 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 知识的人是否能够这样做...
我目前正在做一个项目,需要 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 知识的人是否能够这样做...