使用Upstart启动java swing进程 - 没有设置X11 DISPLAY变量

时间:2015-04-07 21:39:17

标签: java linux swing x11 upstart

我有一个可运行的jar文件,它是由我在嵌入式系统上运行的clojure代码生成的(udoo - http://www.udoo.org/),它运行的是一个版本的Ubuntu for OS(udoobuntu - http://www.udoo.org/udoobuntu-the-official-udoo-linux-operating-system/

jar文件包含我编写的clojure库,其中包含一些Java swing内容。

使用以下命令通过命令行手动运行jar:     sudo java -jar myjar.jar 工作良好。某些USB设备权限需要sudo。

当我尝试使用名为testjob的upstart脚本启动jar时出现问题。 /etc/init/testjob.conf的相关部分如下所示:

start on (desktop-session-start)

expect fork

script
        exec ./home/ubuntu/start > /home/ubuntu/boot-jar.log 2>&1 &
end script

其中/ home / ubuntu / start是以下shell脚本:

#!/bin/sh 
sudo java -jar /home/ubuntu/myjar.jar
exit 0

当此项运行时,可以手动通过:     sudo开始testjob 或者通过重新启动系统自动,我得到以下输出到日志文件:

Exception in thread "main" java.lang.ExceptionInInitializerError

... <bunch of meaningless classloading stuff>

Caused by: java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
    at sun.awt.HeadlessToolkit.getMenuShortcutKeyMask(HeadlessToolkit.java:236)
    at seesaw.keystroke$preprocess_descriptor.invoke(keystroke.clj:25)
    at seesaw.keystroke$keystroke.invoke(keystroke.clj:50)
    at seesaw.keystroke$keystroke.invoke(keystroke.clj:49)
    at seesaw.keymap$map_key.doInvoke(keymap.clj:107)
    at clojure.lang.RestFn.invoke(RestFn.java:445)
    at seesaw.widgets.log_window$log_window.doInvoke(log_window.clj:88)
    at clojure.lang.RestFn.invoke(RestFn.java:457)
    at physicloud.utils__init.load(Unknown Source)
    at physicloud.utils__init.<clinit>(Unknown Source)
    ... 52 more

我实际上并没有进行任何UI调用,但是在运行库的类加载时运行失败。我知道一个简单的解决方法是从库中删除Java Swing代码,但是库被推广为允许ui输出到有能力的机器,因此我正在寻找一种解决方法。对我来说,为什么jar会通过java -jar而不是脚本运行是没有意义的。

我为新手脚本尝试了不同的案例&#34;开始&#34;条件,所有这些都产生了相同的结果。

我尝试在执行jar之前在upstart脚本中设置$ DISPLAY环境变量,但无济于事。

我也尝试使用crontab @reboot安排启动脚本,但错误是一样的。

有人有建议吗?

1 个答案:

答案 0 :(得分:1)

您可以将-Djava.awt.headless=true传递给java,以允许运行依赖于某些UI库的非GUI应用程序。

例如,

java -Djava.awt.headless=true -jar something.jar