1

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

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

编辑我正在使用 maven 3

4

3 回答 3

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 选项。因为这些文件是项目源代码树的一部分,所以它们将出现在所有项目签出中,并且每次构建项目时都会自动使用。

作为官方发行说明的一部分

在 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提供了compilerArgsJVM 选项的配置入口,Maven Surefire 插件提供了argLine相同的配置选项,等等。

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

于 2016-03-14T14:48:05.223 回答
0

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

于 2016-04-18T12:37:38.270 回答
0

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

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

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

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

于 2016-03-18T10:28:25.543 回答