有些程序在设计之初就设计成了需要桌面环境下执行。最近公司就遇到了这样的问题。公司的盒子会调用第三方的office的jar包,该包的功能就是将doc、docx、ppt、pptx之类的文件转化成html 。但该包有一个苛刻的要求,就是需要在linux 桌面环境下调用,如果找不到桌面环境就会失败退出。

由于最初的调试是在gnome环境下进行的,所以tomcat没有图形调用的问题。不过一部署到现网服务器上,tomcat在调用office的转换时就报“Can’t connect to X11 window server” 。网上有人提出在java调用时加上参数: -Djava.awt.headless=true

经测试,上面的方法根本行不通,因为office的jar包必须要桌面环境,这不是tomcat决定的 。如果每次启动tomcat在VNC环境下启动不会有问题,但这是linux服务器,总不能每次都在VNC下运行程序 。

后来想下可以在启动脚本里加上X11所需要的桌面环境变量,就可以在终端下执行X11程序了。测试方法是在一台测试机上先将启动级别调为5 ,通过ctrl+Alt+F1 回到终端下。执行下面的脚本:

 1#!/bin/bash
 2PATH="/usr/X11R6/bin":$PATH
 3export PATH
 4DISPLAY=:0.0
 5export DISPLAY
 6userresources=$HOME/.Xresources
 7usermodmap=$HOME/.Xmodmap
 8sysresources=/etc/X11/xinit/.Xresources
 9sysmodmap=/etc/X11/xinit/.Xmodmap
10# merge in defaults and keymaps
11if [ -f $sysresources ]; then
12    xrdb -merge $sysresources
13fi
14if [ -f $sysmodmap ]; then
15    xmodmap $sysmodmap
16fi
17if [ -f $userresources ]; then
18    xrdb -merge $userresources
19fi
20if [ -f $usermodmap ]; then
21    xmodmap $usermodmap
22fi
23# start the window manager
24#exec quartz-wm &
25# if bash shell execute /etc/profile
26if [ "$SHELL" = "/bin/bash" ]
27then
28    . /etc/profile
29fi
30xterm &

将该脚本保存后,在终端下执行 。执行完了以后再ctrl +Alt+F7切到桌面下看是不是启了一个xterm程序了。经验证果然启了一个xterm程序 。

注:默认情况下,linux DISPLAY的桌面号是:0.0 ,如果是在VNC下有可能就不是这个了。需要VNC登陆后,通过echo $DISPLAY 命令查看 。

在正常将系统在5级别启动时,DISPLAY环境变量哪段设置也可以省略,可以省略的内容如下:

1PATH="/usr/X11R6/bin":$PATH
2export PATH
3DISPLAY=:0.0
4export DISPLAY

事情到了这里就简单了,想执行什么就把后面的xterm &换成你要执行的内容就行了。如所需的是换成了:

1office_home=$1
2$1/Jre/bin/java -classpath :$office_home/Yozo_Office.jar:$office_home/tool.jar: EIOfficeUtils $2 $3 $4