20

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

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

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

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

我该怎么做:

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

谢谢。

4

3 回答 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 程序集插件配置将所有本机库放入lib/native您的 dist 目录:

<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")
于 2012-04-10T21:10:52.690 回答
5

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

于 2012-04-09T09:46:22.937 回答
0

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

只要您遵循它们的命名约定,maven-nativedependencies-plugin 插件就会自动为您执行此操作

于 2012-04-09T10:55:42.840 回答