Office UNO 组件的透明使用

From Apache OpenOffice Wiki
Jump to: navigation, search




如果某些客户机代码想要使用 Office UNO 组件,则典型的使用情况是客户机代码首先查找现有的 Office 安装程序。如果找到了安装程序,则客户机检查 Office 进程是否已经在运行。如果没有任何 Office 进程在运行,则将启动一个 Office 进程。之后,客户机代码使用远程 UNO 机制与正在运行的 Office 连接,以获取该 Office 的远程组件上下文。然后,客户机代码就可以使用远程组件上下文访问任意的 Office UNO 组件。从客户机代码的角度来看,本地和远程组件之间毫无区别。


引导方法

因此,com.sun.star.comp.helper.Bootstrap.bootstrap()方法以更加透明的方式提供远程 Office 组件上下文,该方法从 UNO 安装程序引导组件上下文。随后,简单的客户机应用程序可能显示为:

  // get the remote office component context
  XComponentContext xContext =
      com.sun.star.comp.helper.Bootstrap.bootstrap();
 
  // get the remote office service manager
  XMultiComponentFactory xServiceManager =
      xContext.getServiceManager();
 
  // get an instance of the remote office desktop UNO service
  Object desktop = xServiceManager.createInstanceWithContext(
      "com.sun.star.frame.Desktop", xContext );

com.sun.star.comp.helper.Bootstrap.bootstrap() 方法首先引导本地组件上下文,然后试图建立与正在运行的办公软件命名管道的连接。如果没有任何办公软件在运行,则将启动一个 Office 进程。如果连接成功,则将返回远程组件上下文。


Documentation note.png 请注意,com.sun.star.comp.helper.Bootstrap.bootstrap() 方法从 OpenOffice.org 1.1.2 开始可用。


SDK 工具

为了方便起见,OpenOffice.org 软件开发工具包 (SDK) 提供了一些用于编写 Java 客户机应用程序的工具。


Java 客户机应用程序的要求之一是 Java 查找com.sun.star.comp.helper.Bootstrap 类和所有 UNO 类型(例如 UNO 接口)以及客户机代码使用的其他 Java UNO 语言绑定类(例如 com.sun.star.uno.AnyConverter)。一种很自然的方法是将 UNO jar 文件添加到 Java CLASSPATH,但这需要知道 UNO 的安装位置。其他方法是使用 Java 扩展机制,或者是将包含 UNO 类型的 jar 文件部署到客户机 jar 文件中。这些方法都有若干缺点,最重要的一个缺点是类型冲突问题。例如,如果部署的组件添加新的 UNO 类型。因此,SDK 工具提供了一种更为动态的方法,即自定义类加载器。自定义类加载器有扩展的搜索路径,也包括 UNO 的安装路径。使用搜索算法可以在系统上自动检测到 UNO 安装程序。


自定义类加载器

此概念基于以下要求:使用 UNO 类型的各个类或者随办公软件安装程序附带的其他类都通过自定义的类加载器加载。此自定义类加载器识别 UNO 的安装位置,并从属于办公软件安装程序的 jar 文件或类文件加载各个类。这意味着必须先实例化和初始化自定义类加载器,然后才能加载使用 UNO 的第一个类。


SDK 工具允许创建客户机 jar 文件,该文件可以通过以下方法调用:

 java -jar SimpleBootstrap_java.jar


客户机 jar 文件包含以下文件:

 META-INF/MANIFEST.MF
 com/sun/star/lib/loader/InstallationFinder$StreamGobbler.class
 com/sun/star/lib/loader/InstallationFinder.class
 com/sun/star/lib/loader/Loader$CustomURLClassLoader.class
 com/sun/star/lib/loader/Loader.class
 com/sun/star/lib/loader/WinRegKey.class
 com/sun/star/lib/loader/WinRegKeyException.class
 win/unowinreg.dll
 SimpleBootstrap_java.class


使用 SDK 工具创建的客户机应用程序将自动加载类 com.sun.star.lib.loader.Loader,该类可设置自定义类加载器,用于加载应用程序类。为此,SDK 工具创建了一个包含以下 Main-Class 项的清单文件

 Main-Class: com.sun.star.lib.loader.Loader


自定义加载器需要清单文件中有一个特殊项,该项指定了包含客户机代码的类的名称:

 Name: com/sun/star/lib/loader/Loader.class
 Application-Class: SimpleBootstrap_java


正确创建和设置自定义类加载器后,com.sun.star.lib.loader.Loader.main 的实现读取此项,并调用应用程序类的 main 方法。SDK 工具将接管为应用程序类编写正确的清单项的任务。


查找 UNO 安装位置

UNO 安装程序的位置可以通过 Java 系统属性 com.sun.star.lib.loader.unopath 来指定。通过 使用 -D 标志,可以将系统属性传送到客户机应用程序,例如

 java 
 -Dcom.sun.star.lib.loader.unopath=/opt/OpenOffice.org/program 
 -jar SimpleBootstrap_java.jar


另外,UNO 的安装位置也可以通过将环境变量设置为 UNO 安装的程序目录来指定,例如

 setenv UNO_PATH /opt/OpenOffice.org/program


Documentation caution.png 此方法不适用于 Java 1.3.1 和 Java 1.4,因为这些 Java 版本不支持环境变量。


如果用户未指定 UNO 的安装位置,则将搜索系统中 UNO 的默认安装位置。搜索算法与平台相关。


在 Windows 平台上,通过从 Windows 注册表中的根项 HKEY_CURRENT_USER 读取默认值项 'Software\OpenOffice.org\UNO\InstallPath',可以找到 UNO 的安装位置。如果没有此项,则可以从根项 HKEY_LOCAL_MACHINE 读取。安装办公软件的过程中,始终要写入其中一项。在单用户安装中,该项被写入 HKEY_CURRENT_USER,在管理员的多用户安装中,该项被写入 HKEY_LOCAL_MACHINE。请注意,默认安装程序是最新安装的办公软件,但有 HKEY_CURRENT_USER 的优先级比 HKEY_LOCAL_MACHINE 高的限制。读取 Windows 注册表要求本地程序库 unowinreg.dll 是应用程序 jar 文件的一部分,或者可以在 java.library.path中找到它。SDK 工具会自动将本地程序库放入包含客户机应用程序的 jar 文件中。


在 Unix/Linux 平台上,UNO 的安装位置可以从 PATH 环境变量找到。请注意,对于 Java 1.3.1 和 Java 1.4,安装位置可以通过使用 which 命令找到,因为这些 Java 版本不支持环境变量。这两种方法都要求 soffice 可执行文件或符号链接位于 PATH 环境变量中列出的目录之一。对于 OpenOffice.org 2.0 之前的旧版本,上述方法可能会失败。在这种情况下,UNO 安装位置来自用户主目录中的 .sversionrc 文件。默认安装是指向 UNO 安装的 .sversionrc 文件中的最后项。请注意,OpenOffice.org 2.0 不再有 .sversionrc 文件。


Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages