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

How to use JACOB in an OSGi application?

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

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

编辑 我正在使用 maven 3

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

MAVEN_OPTS

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

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

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

.mvn 设置

自从 Maven 3.3.1 以来,您可以将 .mvn 文件夹作为相关项目的一部分,并将 jvm.config 文件作为此类选项的完美位置。

two new optional configuration files .mvn/jvm.config and .mvn/maven.config, located at the base directory of project source tree. If present, these files will provide default jvm and maven options. Because these files are part of the project source tree, they will be present in all project checkouts and will be automatically used every time the project is build.

作为官方的一部分release notes

In Maven it is not simple to define JVM configuration on a per project base. The existing mechanism based on an environment variable MAVEN_OPTS and the usage of ${user.home}/.mavenrc is an other option with the drawback of not being part of the project.

Starting with this release you can define JVM configuration via ${maven.projectBasedir}/.mvn/jvm.config file which means you can define the options for your build on a per project base. This file will become part of your project and will be checked in along with your project. So no need anymore for MAVEN_OPTS, .mavenrc files. So for example if you put the following JVM options into the ${maven.projectBasedir}/.mvn/jvm.config file:

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

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

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

-Djava.library.path=<path_to_dir>

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

插件配置

您应该将其设置为相关的插件和配置条目,如果有的话。 例如,Maven Compiler Plugin provides the compilerArgs configuration entry for JVM options, the Maven Surefire Plugin provides the argLine 配置选项相同,依此类推。

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

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

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

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

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

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