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

jbx*_*jbx 17 java java-native-interface maven maven-nar-plugin

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

如何将Maven中的本机部分包含在我的项目中(最终使用copy-dependencies插件导出).这是一个标准的J2SE应用程序(不是网络应用程序),包装.jar?

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

我遇到了maven-nar-plugin,它似乎以本机构建为目标,但似乎更倾向于从代码构建JNI项目,而不是捆绑第三方JNI库,我无法将拼图拼凑在一起.

我该怎么做:

  1. 在我的本地存储库中安装这些,具有.jar取决于.so库.
  2. 在POM文件中包含依赖项(在.jar和.so上).

谢谢.

ale*_*sko 10

我的方法:

.so使用特定于平台的分类器将文件放入存储库,如下所示:sqlite3-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>
Run Code Online (Sandbox Code Playgroud)

使用这个maven程序集插件配置将所有本机库放入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>    
Run Code Online (Sandbox Code Playgroud)

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

CtzJniUtils.loadJniLibsFromStandardPath(Launcher.class, "sqlite3")
Run Code Online (Sandbox Code Playgroud)


Pet*_*rey 5

在加载之前,我将.so包含在jar中,并额外添加特定于平台的共享库.这样就可以像任何其他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