如何在OSGi应用程序中使用JACOB?

时间:2016-03-14 12:48:17

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

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

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

编辑我正在使用maven 3

3 个答案:

答案 0 :(得分:1)

此用例可能有三种可能性

MAVEN_OPTS

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

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为{J}选项提供argLine配置选项,依此类推。

这是最不推荐的方法,因为配置会被复制,甚至不可能(直到插件可配置性)。但是,如果用例确实与某个插件执行(编译,测试等)隔离,那么它可能仍然是合理的。

答案 1 :(得分:0)

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

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

以下是有关OSGi中本机库的一些实用信息:

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

答案 2 :(得分:0)

看起来JACOB有一些特殊的代码似乎与这类错误直接相关。 实际上,LibraryLoader中定义了一个jacob.dll.path,通过该System.loadLibrary可以给Jacob一个绝对路径来访问jacob dll(它不直接使用public function getCardType() { return $this->discr; } )。设置该库直接解决了我的问题。