我已经用Java编写了一个服务器,它允许连接到它的客户端控制计算机的鼠标和键盘。为此,它使用java.awt.Robot
类。
我需要这个服务器在后台运行,并自动启动。我解决这个问题的第一个操作系统是基于Debian的(Ubuntu 11.04),守护进程似乎是显而易见的选择。问题是,当守护进程在引导期间或在安装我的debian包(其postinst脚本使用/etc/init.d/pc-remote-server start
启动它)期间启动时,我得到这个错误:
java.awt.AWTException: headless environment
at java.awt.Robot.<init>(Robot.java:97)
at com.se.pcremote.server.CommandExecuter.<init>(CommandExecuter.java:72)
at com.se.pcremote.server.PCRemoteServer.<init>(PCRemoteServer.java:215)
at com.se.pcremote.server.PCRemoteServer.main(PCRemoteServer.java:122)
有没有什么方法可以在守护进程中使用java.awt.Robot
类?我是否可以从守护进程中衍生一个不是“无头环境”的辅助进程?或者有没有更好的方法让我得到一个像“服务”这样的结果,而没有这个限制?
发布于 2011-05-29 06:47:24
好了,在做了更多的研究并尝试了更多的选项之后,下面是我的想法:
我可以在守护进程中使用java.awt.Robot吗?不是的。
在我的问题下面,我做了一点详细的阐述:
有没有什么方法可以在守护进程中使用java.awt.Robot类?不是的。如上段所述。
我是否可以从守护进程中衍生一个不是“无头环境”的辅助进程?不是我想出来的。如果我真的这样做了,那将会有很多工作要做。
或者有没有更好的方法让我得到一个像“服务”这样的结果,而没有这个限制?是!使用桌面环境!在我的例子中,因为我使用的是Ubuntu,所以桌面环境是Gnome。Gnome有一个启动应用程序特性,它可以在全局和每个用户的基础上运行.desktop文件,如here所述。它们还提供了有关这些.desktop文件here的结构的信息。我在/etc/xdg/autostart
(全局自动启动文件夹)中添加了一个运行我的Java‘服务’的.desktop文件,它就像一件乐事。
发布于 2011-05-22 16:07:42
"Headless“意味着这段代码需要访问图形环境,但它并没有。
您可以通过提供一个系统属性在无头模式下运行,该属性提供了一个粗糙的实现,该实现只提供了运行应用程序的基础,但很可能不支持Robot。不过,先试一下吧。
如果您无法做到这一点,则需要为您的流程提供一个图形环境。通常的方法是运行VNC X-server,因为它不需要物理硬件,然后连接到它。
发布于 2011-05-22 16:11:29
我假设,您必须正确地设置DISPLAY变量(在启动robot进程时在robot进程的环境中),这样才能正常工作--在本例中,您需要在display变量中指定一个DISPLAY,该变量是在程序启动一段时间后创建的。--
不知道这是否真的有效,但你可以试一试,并在这里报告它是否有效。
https://stackoverflow.com/questions/6086754
复制相似问题