使用OpenOffice SDK加载文档时遇‘no office executable’异常求助
解决OpenOffice SDK在Java中加载文档时的"no office executable"异常
尝试使用Java结合OpenOffice SDK加载文档,调用XComponentContext xContext = Bootstrap.bootstrap()获取组件上下文时,抛出no office executable异常。已参考相关方案配置SDK路径和类路径,但问题仍未解决。
环境信息
- OpenOffice版本:
4.1.14 - 操作系统:MacOS x86_64
- Java版本:8
- OpenOffice SDK路径:
/Users/madhup/Desktop/OpenOffice_SDK - JDK路径:
/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home/bin/javac - 已配置zshrc环境变量
Java代码
import com.sun.star.beans.PropertyValue; import com.sun.star.comp.helper.Bootstrap; import com.sun.star.frame.XComponentLoader; import com.sun.star.lang.XComponent; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; import com.sun.star.comp.helper.BootstrapException; public class LoadDocument { public static void main(String[] args) throws BootstrapException { try { XComponentContext xContext = Bootstrap.bootstrap(); com.sun.star.lang.XMultiComponentFactory xMCF = xContext.getServiceManager(); Object oDesktop = xMCF.createInstanceWithContext( "com.sun.star.frame.Desktop", xContext); XComponentLoader xCompLoader = (XComponentLoader) UnoRuntime.queryInterface( XComponentLoader.class, oDesktop); String documentURL = "file:///Users/path_to_file/hello.odt"; PropertyValue[] loadProps = new PropertyValue[0]; XComponent xComponent = xCompLoader.loadComponentFromURL( documentURL, "_blank", 0, loadProps); if (xComponent != null) { System.out.println("Document loaded successfully."); xComponent.dispose(); } else { System.out.println("Failed to load the document."); } } catch (Exception e) { e.printStackTrace(); } } }
Pom文件配置
<dependencies> <dependency> <groupId>org.openoffice</groupId> <artifactId>unoil</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.openoffice</groupId> <artifactId>juh</artifactId> <version>4.1.2</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.openoffice</groupId> <artifactId>jurt</artifactId> <version>4.1.2</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.openoffice</groupId> <artifactId>ridl</artifactId> <version>4.1.2</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.openoffice</groupId> <artifactId>officebean</artifactId> <version>4.1.2</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.github.jeremysolarz</groupId> <artifactId>bootstrap-connector</artifactId> <version>1.0.0</version> </dependency> </dependencies>
解决方案建议
1. 确认OpenOffice可执行文件路径配置
MacOS下OpenOffice默认可执行文件路径为/Applications/OpenOffice.app/Contents/MacOS/soffice,需确保系统能识别该路径:
- 在zshrc中添加环境变量:
export PATH=$PATH:/Applications/OpenOffice.app/Contents/MacOS - 执行
source ~/.zshrc使配置生效,验证soffice --version是否能正常输出版本信息。
2. 显式指定OpenOffice路径初始化上下文
默认Bootstrap.bootstrap()可能无法自动识别MacOS下的soffice路径,改用BootstrapConnector显式指定路径:
// 替换原有的Bootstrap.bootstrap()代码 String officePath = "/Applications/OpenOffice.app/Contents/MacOS/soffice"; XComponentContext xContext = BootstrapConnector.bootstrap(officePath);
3. 对齐依赖版本与OpenOffice版本
当前Pom中OpenOffice依赖版本为4.1.2,与实际安装的4.1.14版本不匹配,可能引发兼容性问题:
- 将所有
org.openoffice开头的依赖版本改为4.1.14(若Maven仓库无对应版本,可从OpenOffice SDK中手动提取对应jar包引入)。
4. 手动启动OpenOffice服务再连接
先启动OpenOffice无头服务,再通过代码连接已运行的服务:
- 执行启动命令:
soffice --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard
- 修改代码连接服务:
String connectString = "uno:socket,host=127.0.0.1,port=8100;urp;StarOffice.ComponentContext"; XComponentContext xContext = com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(null); com.sun.star.bridge.XUnoUrlResolver resolver = UnoRuntime.queryInterface( com.sun.star.bridge.XUnoUrlResolver.class, xContext.getServiceManager().createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", xContext) ); Object initialObject = resolver.resolve(connectString); XComponentContext remoteContext = UnoRuntime.queryInterface(XComponentContext.class, initialObject); // 后续使用remoteContext替代原xContext
内容的提问来源于stack exchange,提问作者Madhu Patel
相关产品推荐
相关产品推荐

