OpenOffice是一款优秀的开源办公套件,由sun公司贡献给开源社区。如果在Eclipse下继承它,则相当于给Eclipse添加了办公套件的支持。为此,笔者进行了尝试,如下。
OpenOffice提供了若干Jar包,专门提供在Java里面嵌入OpenOffice和调用OpenOffice服务的方法。在其自带的例子中,有OfficeBean和OfficeDev可供参考。但是,如果把他们直接采用SWT_AWT嵌入时,会出现找不到officebean库的异常。经分析,原因在于officeben.jar中的LocalOfficeConnection文件加载officebean库时,采用了如下代码:
String aSharedLibName = getProgramPath() + java.io.File.separator + System.mapLibraryName(OFFICE_LIB_NAME);
System.load(aSharedLibName);
而getProgramPath()采用
File path = NativeLibraryLoader.getResource(this.getClass().getClassLoader(), aExec);
其中,aExec为soffice.exe文件,即OpenOffice的启动文件名称。NativeLibraryLoader.getResource采用 classloader.getResource(s) 加载资源。
问题就出现在最后的classloader.getResource(s)。在普通的Java程序中,只要在PATH路径里面设置了OpenOffice的路径,并且把OpenOffice的路径传递给classpath,则通过classloader.getResource(s)可以正确的找到soffice.exe,从而可以正确得到aSharedLibName的路径。但是在Eclipse下,无论怎样设置PATH和传递classpath都不能使Eclipse找到soffice,从而加载库错误。
找到问题的根源后,直接修改getProgramPath()就可以了。为了在客户机上不用安装OpenOffice,把OpenOffice安装之后的目录拷贝到插件目录下,然后采用如下代码获取插件的目录:
mProgramPath = Platform.getBundle("org.openoffice").getLocation()+"program"; if(mProgramPath.indexOf("@/")>0) {
mProgramPath=mProgramPath.substring(mProgramPath.indexOf("@/")+2);
}
这样就可以加载了。但是别忘记了在PATH中设置上述路径,因为officebean在加载其他组件时采用默认方式,必须在PATH中设置路径才能正确找到。这就要求制作安装程序,由安装程序把此路径写入PATH中。