Могу ли я использовать java.awt.Robot изнутри демона? - PullRequest
2 голосов
/ 22 мая 2011

Я написал сервер на 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 из процесса демона? Мог ли я порождать вторичный процесс из процесса демона, который не является «безголовым окружением»? Или для меня есть лучший способ получить результат, подобный «услуге», который не имеет этого ограничения?

Ответы [ 3 ]

1 голос
/ 22 мая 2011

Полагаю, вы должны правильно установить переменную DISPLAY (в среде процесса робота в момент запуска процесса робота), чтобы это работало - в вашем случае вам нужно будет указать отображение в вашем DISPLAY переменная, которая создается через некоторое время после запуска программы. -

Не знаю, действительно ли это работает, но вы можете попробовать и сообщить здесь, работает ли оно.

1 голос
/ 29 мая 2011

Хорошо, после того, как я провел еще какое-то исследование и попробовал еще несколько вариантов, вот что я придумал:

Могу ли я использовать java.awt.Robot из демона? Нет.

Далее в своем вопросе я немного уточнил:

Можно ли как-нибудь использовать класс java.awt.Robot из процесса демона? Нет. Как и выше.

Могу ли я порождать вторичный процесс из процесса демона, который не является "безголовым окружением"? Не то, чтобы я мог понять. В любом случае, если я это сделаю, будет много работы.

Или есть лучший способ для меня получить результат, подобный «услуге», который не имеет этого ограничения? Да! Используйте среду рабочего стола! В моем случае, так как я использовал Ubuntu, среда рабочего стола была Gnome. В Gnome есть функция Startup Applications , которая запускает файлы .desktop в глобальном масштабе и для отдельных пользователей, как описано здесь . Они также предоставляют информацию о структуре этих файлов .desktop здесь . Я добавил файл .desktop в /etc/xdg/autostart (глобальная папка автозапуска), который запускал мой «сервис» Java, и он работал как удовольствие.

1 голос
/ 22 мая 2011

«Безголовый» означает, что этот код нуждается в доступе к графической среде, а это не так.

Вы можете работать в автономном режиме, предоставив системное свойство, которое обеспечивает грубую реализацию, которая дает только основы для запуска приложений, но, скорее всего, не может поддерживать Robot. Однако попробуйте сначала.

Если вы не можете этого сделать, вам нужна графическая среда для вашего процесса. Обычный способ сделать это - запустить X-сервер VNC, поскольку он не требует физического оборудования, а затем подключиться к нему.

...