在处理 JNI 和 Maven 时,Projects With JNI 是参考应该开始的。它涵盖的内容远远超出您当前的问题(“只是”使用依赖于 JNI 和本机库的库),但是,可以做更多事情的人可以做更少的事情。
如果您仔细阅读,您会发现使用 JNI 库的一种解决方案是将它们捆绑在特定于体系结构的 JAR 中,这样您就可以像依赖 Maven 的任何其他依赖项一样依赖它们。这实际上是 JOGL 版本 1.1.1 打包在 http://download.java.net/maven/2/net/java/dev/jogl/ 中的方式,有一个带有 Java 类的 JAR 工件和几个带有本机库的体系结构特定 JAR 工件。
JNI 库归档在 jar 中
我最终使用的解决方案是
将编译好的 jni 库存放在
jar 在类文件旁边。
这意味着要么交叉编译
所有可能的架构,或更多
简单地说,有一个不同的罐子
每个架构。后者适合
我们的设置非常好 - 在哪里
我们几乎所有的机器都是
Linux-i386,带有少量的win32
盒子。
可悲的是System.load() 无法应付
从 jar 中加载库,
所以我们需要一个自定义
加载程序将库提取到
运行时的临时文件;这是
然而,显然是可以实现的。
然后,正如解释的那样,想法是使用自定义库加载器来加载本机库。好消息是“提供”了这样的加载程序,如下所述。
库加载器
现在我们的 JNI 库位于
类路径,所以我们需要一种方法
加载它。我创建了一个单独的
将提取 JNI 的项目
类路径中的库,然后
加载它们。找到它
http://opensource.mxtelecom.com/maven/repo/com/wapmx/native/mx-native-loader/1.2/。
这是作为依赖项添加到
pom,很明显。
要使用它,请致电
com.wapmx.nativeutils.jniloader.NativeLoader.loadLibrary(libname)。
更多信息在 javadoc 中
NativeLoader.
我通常更喜欢包装这样的东西
在 try/catch 块中,如下所示:
public class Sqrt {
static {
try {
NativeLoader.loadLibrary("sqrt");
} catch (Throwable e) {
e.printStackTrace();
System.exit(1);
}
}
/* ... class body ... */
}
我们现在应该处于
我们的 junit 测试来自 maven;一个MVN
测试应该工作!它也应该工作
在 IDE 中很好。
现在,回答您的问题,如何:
如有必要,从此处自动下载特定于操作系统的 JOGL zip 文件(包含 4 个 jar 文件和一些本机库文件 (.so/.dll));或依赖于一个 Maven 项目,该项目是其中一个文件的包装器。
遗憾的是,JOGL 2.0 jar 在 java.net 的 Maven 存储库中不可用,因此您必须处理这个问题,要么将它们提供在私有存储库中,要么将它们手动安装到每个开发人员的本地存储库中。为此,请使用Guide to installing 3rd party JARs 中记录的mvn install:install-file(而不是像您那样使用mvn deploy:deploy-file,此目标用于将工件安装到远程存储库)。
就我个人而言,我会从您提供的the URL 下载 JOGL 2.0 ZIP,像使用 JOGL 1.1.1 一样打包它(一个 Java JAR 和几个用于本地库的特定 JAR),然后暂时在每个本地存储库中安装 JAR .然后,声明对 Java 工件的标准依赖关系,实际上,使用 profiles 来表示体系结构特定的依赖关系。像这样的:
<project>
...
<dependencies>
<dependency>
<groupId>net.java.dev.jogl</groupId>
<artifactId>jogl</artifactId>
<version>2.0-beta10</version>
</dependency>
...
</dependencies>
...
<profiles>
<profile>
<id>linux-i586</id>
<activation>
<os>
<arch>i386</arch>
<family>unix</family>
<name>linux</name>
</os>
</activation>
<dependencies>
<dependency>
<groupId>net.java.dev.jogl.jogl-linux-i586</groupId>
<artifactId>jogl-linux-i586</artifactId>
<version>2.0-beta10</version>
</dependency>
</dependencies>
</profile>
...
</profiles>
...
</project>
不要忘记添加自定义库加载器所需的存储库和依赖项:
<project>
<repositories>
<repository>
<id>opensource.mxtelecom.com</id>
<url>http://opensource.mxtelecom.com/maven/repo</url>
</repository>
...
<repositories>
...
<dependencies>
<dependency>
<groupId>com.wapmx.native</groupId>
<artifactId>mx-native-loader</artifactId>
<version>1.2</version>
</dependency>
...
</dependencies>
...
</project>
关于你问题的第二部分:
适当地解压缩该 zip 文件,以便 (...)
正如我所解释的,您实际上不会依赖于 ZIP 文件,而是依赖于 JAR,而且您在开发过程中和分发项目时都不需要解压缩它们。对于分发,您只需要创建一个包含依赖项的 jar。这可以通过 maven-assembly-plugin 来完成。请参阅this answer 了解更多详情。