将JNI库添加到本地Maven存储库
我希望使用Maven将JNI库(包括其共享对象(.so)文件)添加到我的项目中。 不幸的是它还没有在公共存储库中,所以我想我必须自己在我的本地存储库上安装它才能使它工作。
如何将Maven中的本机部分包含在我的项目中(最终使用copy-dependencies插件导出)。 这是一个标准的J2SE应用程序(不是网络应用程序),包装.jar?
我试图添加的库是junixsocket ,以防它有助于了解。 它有一个.so(本机库)组件和Java .jar组件。
我遇到了maven-nar-plugin ,似乎是针对原生版本,但似乎更倾向于从代码构建JNI项目,而不是捆绑第三方JNI库,我无法将拼图拼凑在一起。
我该怎么做:
- 在我的本地存储库中安装这些,具有.jar取决于.so库。
- 在POM文件中包含依赖项(在.jar和.so上)。
谢谢。
我的方法:
将.so
文件放入具有特定于平台的分类器的存储库,如下所示: sqlite3-3.7.9-linux-x86_64.so
。 为所有必需的平台添加.so
依赖项:
de.ch-werner sqlite-jdbc 3.7.9 so linux-x86_64
使用这个maven程序集插件配置将所有本机库放入你的lib/native
目录:
lib/native ${artifact.artifactId}${dashClassifier?}.${artifact.extension} false false false *:*:dll:* *:*:so:* *:*:jnilib:*
使用此类在app启动时加载库(计划将分类器命名更改为GNU三元组 ):
CtzJniUtils.loadJniLibsFromStandardPath(Launcher.class, "sqlite3")
在加载之前,我将.so包含在jar中并添加特定于平台的共享库。 这样就可以像任何其他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
作为在运行时解压缩库的替代方法,您可以将它们存储为Maven中的jar,但在构建时解压缩它们: http : //www.buildanddeploy.com/node/17 。
maven-nativedependencies-plugin插件会自动为您执行此操作,只要您遵循其命名约定即可。