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

 2023-01-19    352  

问题描述

我希望使用Maven添加一个JNI库,包括其共享对象(.SO)文件.不幸的是,它尚未在公共存储库上,所以我想我必须在本地存储库上安装它才能使其正常工作.

我如何将Maven中的本机部分包括在我的项目中捆绑在一起(并最终导出了复制依赖性插件).这是一个标准的J2SE应用(不是Web应用程序),带包装.jar?

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

我要添加的库是 junixsocket ,以防万一它有助于知道.
它具有.so(本地库)组件和Java .jar组件.

我遇到 Maven-nar-Plugin 本地构建,但似乎更倾向于通过代码构建JNI项目,而不是捆绑第三方JNI库,我无法将拼图拼图拼凑在一起.

我如何处理:

  1. 将它们安装在我的本地存储库中,具体取决于.so库.
  2. 包括pom文件中的依赖项(在.jar和.so上).

谢谢.

推荐答案

我的方法:

put .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 Assembly插件配置将所有本机Libs放入您的目录中:

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

使用此类将libs加载到应用启动上(计划将分类器命名为 gnu trigets ):

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

其他推荐答案

我在加载它之前将.so在jar中包含在jar中,并在平台特定的共享库中加入.这样,它就像其他任何罐子一样部署.

一个项目的一个示例
https://github.com/peterlawrey/java-thread-thread-affinity

要看的主要课程是 https://github.com/peterlawrey/java-thread-thread-affinity/blob/blob/master/src/src/main/java/java/java/java/highererfrequequequencytrading/-

其他推荐答案

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

maven-nativedendependendencies-plugin 插件将自动为您做到这一点您遵循他们的命名约定.

以上所述是小编给大家介绍的将JNI库添加到本地Maven存储库,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25758.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。