向本地Maven仓库添加JNI库

21

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

我该如何在Maven中包含本地部分,以便将其捆绑在我的项目中(最终使用copy-dependencies插件导出)。这是一个标准的J2SE应用程序(不是Web应用程序),打包成.jar文件?

我正在尝试添加的库是junixsocket,如果知道会有所帮助。它有一个.so(本地库)组件和Java .jar组件。

我发现了maven-nar-plugin,它似乎针对本地构建,但似乎更偏向于从代码构建JNI项目,而不是捆绑第三方JNI库,我无法拼接拼图。

我该如何处理:

  1. 将它们安装在我的本地存储库中,并使.jar依赖于.so库。
  2. 在POM文件中包括关于.jar和.so的依赖。

谢谢。

3个回答

11

我的方法:

将带有特定平台分类器的.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插件配置,将所有本地库都放到您的分发目录下的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")

使用普通的mvn install命令是否可以添加带有平台特定分类器的.so文件? - jbx
@jbx 也许你的意思是 mvn deploy?我只用它来构建由Maven自身构建的Java依赖项。我们的JNI依赖项是不使用Maven构建的,并通过简单的bash脚本使用cURL加载到Maven存储库中。 - alexkasko
不,我的意思是mvn install。我通常为不在Maven存储库中的第三方库执行此操作。http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html 因此,我希望做的实质上是将.so与第三方jar一起包含进去。 - jbx

5

那么你如何部署它并确保本地库被放置在正确的LIBRARY_PATH中呢? - jbx
它不会加载到java.io.tmpdir的子目录中,并且会使用完整路径名进行加载。 - Peter Lawrey

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接