繁体   English   中英

将 JNI 库添加到本地 Maven Repository

[英]Adding a JNI library to the local Maven Repository

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

我 go 如何将 Maven 中的本机部分包含在我的项目中(并最终使用复制依赖项插件导出)。 这是一个标准的 J2SE 应用程序(不是网络应用程序),带有 packaging.jar?

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

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

我如何 go 关于:

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

谢谢。

我的方法:

.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>

使用此 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>    

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

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

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

完成此操作的项目示例,针对不同平台使用 multiple.so 是https://github.com/peter-lawrey/Java-Thread-Affinity

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

作为在运行时解压库的替代方法,您可以将它们存储为 jars 中的 Maven 但在构建时解压它们: http://www.buildanddeploy.com/node/17

maven-nativedependencies-plugin插件会自动为你做这件事,只要你遵循他们的命名约定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM