我有一个可运行的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安排启动脚本,但错误是一样的。
有人有建议吗?
答案 0 :(得分:1)
您可以将-Djava.awt.headless=true
传递给java
,以允许运行依赖于某些UI库的非GUI应用程序。
例如,
java -Djava.awt.headless=true -jar something.jar