我用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
类吗?我可以从守护进程中产生一个不是“无头环境”的辅助进程吗?或者,有没有更好的方法来获得没有此限制的“服务”结果?
答案 0 :(得分:1)
“无头”意味着此代码需要访问图形环境,而它没有。
您可以通过提供一个系统属性来运行无头模式,该属性提供了一个粗略的实现,它只提供了运行应用程序的基础知识,但很可能不支持Robot。不过先尝试一下。
如果您不能这样做,则需要为您的流程提供图形环境。通常的方法是运行VNC X服务器,因为它不需要物理硬件,然后连接到它。
答案 1 :(得分:1)
我认为,您必须正确设置DISPLAY变量(在机器人进程启动时的机器人进程环境中)才能使用 - 在您的情况下,您需要在DISPLAY中指定显示在程序启动后的某个时间创建的变量。 -
不知道这是否真的有效,但您可以尝试一下并在此报告是否有效。
答案 2 :(得分:1)
好的,在做了一些研究并尝试了更多选项后,我想出了:
我可以在守护程序中使用java.awt.Robot吗?否。
在我的问题中,我进一步阐述了一点:
有什么方法可以在守护进程中使用java.awt.Robot类吗?没有。如上所述。
我可以从守护进程中产生一个不是“无头环境”的辅助进程吗?不是我能搞清楚的。如果我这样做的话,那将会是很多工作。
或者,有没有更好的方法让我获得没有此限制的“服务”结果?是的!使用桌面环境!在我使用Ubuntu的情况下,桌面环境是Gnome。 Gnome有一个启动应用程序功能,可以按照here所述的全局和每个用户运行.desktop文件。它们还提供有关这些.desktop文件here的结构的信息。我在运行我的Java'服务'的/etc/xdg/autostart
(全局自动启动文件夹)中添加了一个.desktop文件,它就像是一种享受。