我有一个OSGI(更准确地说是一个基于Wisdom框架的)应用程序,我希望使用JACOB库与Office交互(目标是将PPT转换为图像)。我可以轻松地将JACOB jar添加到我的CLASSPATH中,但是JACOB要求dll在java.library.path
环境变量中可用。
问题:如何在我的maven构建中添加它?
编辑我正在使用maven 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中本机库的一些实用信息:
答案 2 :(得分:0)
看起来JACOB有一些特殊的代码似乎与这类错误直接相关。
实际上,LibraryLoader
中定义了一个jacob.dll.path
,通过该System.loadLibrary
可以给Jacob一个绝对路径来访问jacob dll(它不直接使用public function getCardType()
{
return $this->discr;
}
)。设置该库直接解决了我的问题。