我希望使用Maven将JNI库(包括其共享对象(.so)文件)添加到我的项目中。不幸的是,它还没有存放在公共存储库中,所以我想我必须自己在我的本地存储库中安装它才能使它工作。
如何将Maven中的本机部分包含在我的项目中(最终使用copy-dependencies插件导出)。这是一个标准的J2SE应用程序(不是网络应用程序),包装.jar?
我想要添加的库是junixsocket,以防它有助于了解。 它有一个.so(本机库)组件和Java .jar组件。
我遇到maven-nar-plugin似乎是针对本机构建的,但似乎更倾向于从代码构建JNI项目,而不是捆绑第三方JNI库,我无法分割拼图游戏。
我该怎么做:
感谢。
答案 0 :(得分:9)
我的方法:
将.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
目录中:
<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>
使用this class在应用启动时加载库(计划将分类器命名更改为GNU triplets):
CtzJniUtils.loadJniLibsFromStandardPath(Launcher.class, "sqlite3")
答案 1 :(得分:5)
我在jar中包含.so,并在加载之前添加特定于平台的共享库。这样就可以像任何其他jar一样进行部署。
完成此操作的项目示例,其中包含针对不同平台的多个.so https://github.com/peter-lawrey/Java-Thread-Affinity
答案 2 :(得分:0)
作为在运行时解压缩库的替代方法,您可以将它们存储为Maven中的jar,但在构建时解压缩它们:http://www.buildanddeploy.com/node/17。
maven-nativedependencies-plugin插件会自动为您执行此操作,只要您遵循其命名约定即可。