我需要在启动时在 ARM 设备内的 Raspbian Wheezy Debian 发行版中运行 Java JAR Swing GUI 可执行文件。
我正在关注这作为参考myapp
,myapp-start.sh
和myapp-stop.sh
, 和这以及可能的解决方案(以及其他更相似的解决方案)。但这里没有引用 DISPLAY 变量。
我已经检查了很多替代方案,
尝试过但不适用的选项:
/usr/bin/java -jar -Djava.awt.headless=true $myapp.jar
unset DISPLAY
(在句子里面myapp-start.sh
,上面java -jar
)
错误:
java.awt.HeadlessException: No X11 DISPLAY variable was set, but this program performed an operation which requires it.
尝试过的选项(在句子里面myapp-start.sh
,上面java -jar
):
export DISPLAY=:0
export DISPLAY=:0.0
export DISPLAY=localhost:0.0
错误:
Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable
...Client is not authorized to connect to ServerException in thread stack
...
未尝试过的选项
ssh - X localhost
ssh
: 我应该如何对服务器进行操作X11
?我应该在流程下哪里执行它init.d
?这是使用 GUI 运行 Java 程序的标准解决方案吗?USER=root
insidemyapp-start.sh
:init.d
停止,并请求密码。如此聪明,该过程不会启动。- 上面的任何选项是否应该包含在
myapp-start.sh
代码之外的其他位置?在哪里?
不应该是更简单在启动时运行一段代码?
任何其他选择,将不胜感激。
编辑2015-04-12
新选项
在以下选项中,我在此位置添加一段代码,/etc/xdg/lxsession/LXDE-pi/autostart
以便在默认用户pi
登录和 X11 启动后执行(请参阅伊利亚格雷建议):
usr/bin/java -jar /home/pi/Embedded/bin/PowerBar.jar
(没有&符号)export DISPLAY=:0.0
usr/bin/java -jar /home/pi/Embedded/bin/PowerBar.jar
(没有&符号)/bin/bash /home/pi/Embedded/bin/powerbarstart.sh
(没有&符号)
它们都在后台启动应用程序,即播放背景音乐,并且只能通过 VNC 访问图形:0
(使用TightVNC
)。作为副作用,屏幕保护程序会激活,应用程序会冻结,大约每 60 秒一次。请注意,同一位置也可用于禁用屏幕保护程序。
是否有缺少的选项或符号,我没有包括在内?
解决方案
该设备被配置为:1.0
而不是:0.0
。改变这个就myapp-start.sh
解决了问题。
答案1
如果您的应用程序不是交互式的,您可以启动虚拟 X11 服务器并设置 DISPLAY 变量供您的应用程序使用它。
可以通过这种方式使用的可能的 X11 服务器有:
后者允许您稍后连接以使用 VNC 客户端 (vncviewer) 查看屏幕并与之交互。
如果您的 Raspberry pi(或类似设备)配置为pi
在图形环境下自动登录用户,则可以以用户身份启动应用程序pi
并使用:0
显示屏。请注意,在执行此操作之前,您必须确保 X11 已完成启动。
编辑:看起来您的配置首先作为pi
用户启动 Xvnc 服务器,然后作为用户启动帧缓冲区主 X 服务器root
。在这种情况下,正如您所发现的,您的应用程序必须作为其显示启动root
并使用。:1
或者,如果您真正想要的不是在引导时启动应用程序一次,而是每当用户(通常pi
)在图形环境下登录时,请将其添加到适用于该图形环境的 rc 文件中。例如/etc/xdg/lxsession/LXDE-pi/autostart
。