我有一个 OSGI(更准确地说是基于 Wisdom 框架)应用程序,我想在其中使用 JACOB 库与 Office 交互(目标是将 PPT 转换为图像)。java.library.path
我可以轻松地将 JACOB jar 添加到我的 CLASSPATH,但 JACOB 要求 dll 在环境变量中可用。
问题:如何将它添加到我的 Maven 构建中?
编辑我正在使用 maven 3
我有一个 OSGI(更准确地说是基于 Wisdom 框架)应用程序,我想在其中使用 JACOB 库与 Office 交互(目标是将 PPT 转换为图像)。java.library.path
我可以轻松地将 JACOB jar 添加到我的 CLASSPATH,但 JACOB 要求 dll 在环境变量中可用。
问题:如何将它添加到我的 Maven 构建中?
编辑我正在使用 maven 3
对于这个用例,您可能有三种可能性
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提供了compilerArgs
JVM 选项的配置入口,Maven Surefire 插件提供了argLine
相同的配置选项,等等。
这是最不推荐的方法,因为配置会重复并且通常甚至不可能(直到插件可配置性)。但是,如果用例确实与某个插件执行(编译、测试等)隔离,那么它可能仍然是合理的。
似乎 JACOB 有一些特殊代码,似乎与此类错误直接相关。确实,有一个jacob.dll.path
定义LibraryLoader
可以为 Jacob 提供访问 jacob dll 的绝对路径(不直接使用System.loadLibrary
)。设置该库直接解决了我的问题。
我对 maven 部分有点困惑,因为当您使用 OSGi 时,这通常不是运行时库的一部分。
在 OSGi 中,如果您在 OSGi 框架中使用 dll,那么这一切都可以由 OSGi 框架设置。您必须将 DLL 打包到 JAR 中并提供一些属性。在运行时,框架然后提取库并确保可以找到它。(多个相互依赖的 DLL 存在一些问题。)
以下是有关 OSGi 中的本机库的一些实用信息: