【问题标题】:How to use JACOB in an OSGi application?如何在 OSGi 应用程序中使用 JACOB?
【发布时间】:2016-03-14 12:48:17
【问题描述】:

我有一个 OSGI(更确切地说是基于 Wisdom 框架的)应用程序,我想在其中使用 JACOB 库与 Office 交互(目标是将 PPT 转换为图像)。我可以轻松地将 JACOB jar 添加到我的 CLASSPATH,但 JACOB 要求 dll 在 java.library.path 环境变量中可用。

问题:如何将它添加到我的 maven 构建中?

编辑我正在使用 maven 3

【问题讨论】:

    标签: maven osgi maven-3 jacob wisdom-framework


    【解决方案1】:

    对于这个用例,您可能有三种可能性

    MAVEN_OPTS

    您可以使用 MAVEN_OPTS 环境变量将所需的 JVM 选项传递给 Maven 构建(对于整个构建,因此适用于所有涉及的插件/目标执行):

    export MAVEN_OPTS="-Djava.library.path=<path_to_dir>"
    

    但是,这也将应用于同一环境所涉及的所有其他构建。在 Jenkins 作业中,您仍然可以为每个作业配置此变量,因此在某个构建中被隔离。

    .mvn 设置

    由于 Maven 3.3.1,您可以将 .mvn 文件夹作为相关项目的一部分,并将 jvm.config 文件作为此类选项的理想位置。

    两个新的可选配置文件.mvn/jvm.config.mvn/maven.config,位于项目源代码树的基目录。如果存在,这些文件将提供默认的 jvm 和 maven 选项。因为这些文件是项目源代码树的一部分,所以它们会出现在所有项目签出中,并且会在每次构建项目时自动使用。

    作为官方release notes的一部分

    在 Maven 中,基于每个项目定义 JVM 配置并不简单。基于环境变量MAVEN_OPTS 的现有机制和${user.home}/.mavenrc 的使用是另一种选择,缺点是不属于项目。

    从此版本开始,您可以通过 ${maven.projectBasedir}/.mvn/jvm.config 文件定义 JVM 配置,这意味着您可以在每个项目基础上定义构建选项。该文件将成为您项目的一部分,并将与您的项目一起签入。所以不再需要MAVEN_OPTS.mavenrc 文件。例如,如果您将以下 JVM 选项放入 ${maven.projectBasedir}/.mvn/jvm.config 文件中:

    -Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true
    

    如果是多模块项目,这些选项将应用于所有模块。

    您的${maven.projectBasedir}/.mvn/jvm.config 文件因此可以提供以下内容:

    -Djava.library.path=<path_to_dir>
    

    这种方法的主要优点是配置与相关项目隔离并应用于整个构建。

    插件配置

    您应该将其设置为相关的插件和配置条目(如果有)。 例如,Maven Compiler Plugin 为 JVM 选项提供了 compilerArgs 配置条目,Maven Surefire Plugin 为相同的选项提供了argLine 配置选项,等等。

    这是最不推荐的方法,因为配置会重复并且通常甚至不可能(取决于插件的可配置性)。但是,如果用例真的被隔离到某个插件执行(编译、测试等),那么它可能仍然是合理的。

    【讨论】:

      【解决方案2】:

      我对 maven 部分有点困惑,因为当您使用 OSGi 时,这通常不是运行时库的一部分。

      在 OSGi 中,如果您在 OSGi 框架中使用 dll,那么这一切都可以由 OSGi 框架设置。您必须将 DLL 打包到 JAR 中并提供一些属性。在运行时,框架然后提取库并确保可以找到它。 (多个相互依赖的 DLL 存在一些问题。)

      这里有一些关于 OSGi 中原生库的实用信息:

      http://enroute.osgi.org/appnotes/native-libraries.html

      【讨论】:

        【解决方案3】:

        看起来 JACOB 有一些特殊代码,似乎与此类错误直接相关。 实际上,LibraryLoader 中定义了一个jacob.dll.path,通过它可以为 Jacob 提供访问 jacob dll 的绝对路径(不直接使用 System.loadLibrary)。设置那个库直接解决了我的问题。

        【讨论】:

          猜你喜欢
          • 2011-06-23
          • 1970-01-01
          • 2019-06-15
          • 2019-03-19
          • 2019-09-20
          • 2011-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多