将 JNI 库添加到本地 Maven 存储库

我希望使用Maven将JNI库,包括其共享对象(.so)文件添加到我的项目中。不幸的是,它还没有在公共存储库上,所以我想我必须自己在本地存储库上安装它才能使其正常工作。

我如何在Maven中包含本机部分以捆绑在我的项目中(并最终与复制依赖项插件一起导出)。这是一个标准的 J2SE 应用程序(不是 Web 应用程序),具有打包.jar?

我试图添加的库是junixsocket,以防万一它有助于了解。它有一个.so(本机库)组件,Java .jar组件。

我遇到了maven-nar-plugin,它似乎针对原生构建,但似乎更倾向于从代码构建JNI项目,而不是捆绑第三方JNI库,我无法将拼图拼凑在一起。

我该怎么做:

  1. 将这些安装到我的本地存储库中,根据 .so 库.jar。
  2. 在 POM 文件中包括依赖项(对.jar和 .so)。

谢谢。


答案 1

我的方法:

使用特定于平台的分类器将文件放入存储库,如下所示:.为所有必需的平台添加依赖项:.sosqlite3-3.7.9-linux-x86_64.so.so

<dependency>
    <groupId>de.ch-werner</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.7.9</version>
    <type>so</type>
    <classifier>linux-x86_64</classifier>
</dependency>

使用此 maven 程序集插件配置将所有本机库放入 dist 的目录中:lib/native

<dependencySet>
    <outputDirectory>lib/native</outputDirectory>
    <outputFileNameMapping>${artifact.artifactId}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
    <unpack>false</unpack>
    <useProjectArtifact>false</useProjectArtifact>
    <useStrictFiltering>false</useStrictFiltering>
    <includes>
        <include>*:*:dll:*</include>
        <include>*:*:so:*</include>
        <include>*:*:jnilib:*</include>
    </includes>
</dependencySet>    

使用此类在应用程序启动时加载库(计划将分类器命名更改为 GNU 三元组):

CtzJniUtils.loadJniLibsFromStandardPath(Launcher.class, "sqlite3")

答案 2

我在jar中包含.so,并在加载之前额外添加特定于平台的共享库。通过这种方式,它的部署就像任何其他jar一样。

完成此操作的项目示例,其中针对不同平台有多个 .so,https://github.com/peter-lawrey/Java-Thread-Affinity

要查看的主要类是 https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/com/higherfrequencytrading/affinity/impl/NativeAffinity.java


推荐