我正在 Linux 上运行 Java Swing 应用程序。我用服务包装了 Java 代码。
我可以从命令提示符启动 my_java_service ,没有任何问题。
我希望我的应用程序在启动时启动。所以我使用命令将 my_java_service 复制到 /etc/rc5.d 文件夹update-rc.d
。
X服务器的启动顺序是START20(S20)。
所以我把START55(S55)的启动命令给了my_java_service。
我得到的错误是这样的:
Exception in thread "main" java.awt.AWTError: Can't connect to X11 window server using '0.0' as the value of the DISPLAY variable.
我相信 my_java_service 在启动时无法到达 X 服务器。
我在 my_java_service 中使用xhost +local:all
但它什么也没做。
如何访问 X 服务器并在启动时启动我的应用程序?
答案1
如果你想让这个工作正常,你的应用程序的窗口就会在登录屏幕上弹出,任何走过的人都可以访问 - 你真的想要这个吗?
当有人登录时,我认为在登录屏幕上启动的任何窗口都将被迫终止,因此您的应用程序必须检测用户登录并以某种方式重新建立与该用户会话的连接。当有人使用 GUI 注销时,将触发 X 服务器重置,这肯定会强制所有 X 应用程序与服务器断开连接。这将需要复杂的重新连接逻辑,或者接受在服务运行时不得使用本地 GUI。
如果您的实际需求只是独立于 GUI 控制台上的用户登录/注销来运行 java 服务,那么更好的解决方案是为您的应用程序设置单独的 X 服务器。
如果您有时需要与应用程序交互,则独立的 VNC X 服务器可能比较合适。它有自己的虚拟显示器,如有必要,您可以使用 VNC 客户端连接到它。
如果根本不需要使用本地 GUI 与应用程序交互,那么您可以使用虚拟帧缓冲区 X 服务器,它根本没有真正的显示,但在其他方面的行为就像一个真正的 X 服务器。您可能会发现您的 Linux 发行版将其打包为xvfb
或类似的。