[英]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.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(作为服务器)
阿帕奇2
PHP 7.1.8
奇怪的是,当我从ubuntu终端(不使用php)或在Windows 10(使用php)上进行操作时,它确实起作用。
我是Java新手,您能解释一下该怎么做吗?
我认为最重要的是了解Windows中的GUI和Linux中的GUI之间的区别:
在Windows中,GUI是操作系统的一部分。 如果某个程序(例如文本编辑器)创建了一个窗口,则文本编辑器会告诉Windows打开一个窗口。 如果使用鼠标在窗口上单击,Windows会告诉文本编辑器在窗口上有鼠标单击。
Linux没有内置的GUI。 取而代之的是,有一个称为“ X服务器”或“ X11服务器”的特殊程序提供了GUI:如果文本编辑器创建了一个窗口,它将向X11服务器发送一条消息“创建窗口”。 如果您按下鼠标,则X11服务器将消息“鼠标按下”发送回文本编辑器。
由于Linux是多用户操作系统,因此可以区分您使用的GUI和Apache使用的GUI。 由于Apache不使用GUI,因此Java程序(由Apache间接启动)将失败,因为没有可用的GUI。
这是因为我正在使用桌面功能...
在这两种情况下(Windows和Linux),您的Java程序只能与运行Web服务器的GUI进行交互。
换一种说法:
当您的Web服务器在一台PC上运行,而Web浏览器在另一台PC上运行时,Java程序将访问运行Web服务器的PC的GUI,而不访问运行Web浏览器的PC的GUI!
您确定要这样做吗?
有关alirabie的评论的一些解释:
您是否可以将X11请求转发到本地桌面?
X11系统允许您在连接文本,键盘和鼠标的计算机上运行“ X11服务器”,而文本编辑器(或其他工具)则在功能更强大的计算机(例如Web服务器)上运行。
此概念类似于基于Web浏览器的“云”文本编辑器,其中实际的文本编辑器在某些Web服务器上运行,而只有Web浏览器在您的本地计算机上运行。
因此,您可以在运行Web浏览器的计算机上安装X11 GUI,并以该GUI被“ Apache使用”的方式配置Apache。
但是我怀疑没有很多X11知识的人是否能够这样做...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.