繁体   English   中英

从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.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM