2012-04-09 275 views
13

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

我该如何着手将Maven中的本地部分捆绑到我的项目中(并最终使用copy-dependencies插件导出)。这是一个标准的J2SE应用程序(不是网络应用程序),包装.jar?

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

我碰到maven-nar-plugin这似乎是针对本地构建,但似乎更倾向于从代码构建JNI项目,而不是捆绑第三方JNI库,我无法将拼图拼图拼凑在一起。

我怎么去:

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

谢谢。

回答

5

在加载它之前,我在jar和额外的特定于平台的共享库中包含了.so。这样它就像其他jar一样部署。

这里做到这一点,有多个。所以对于不同的平台项目的一个例子是 https://github.com/peter-lawrey/Java-Thread-Affinity

主类以IS https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/com/higherfrequencytrading/affinity/impl/NativeAffinity.java

+0

如何部署它然后nd确保本地库放在正确的LIBRARY_PATH中? – jbx 2012-04-09 09:48:02

+0

它不会,它会加载到'java.io.tmpdir'的子目录中,并加载完整的路径名。 – 2012-04-09 09:50:15

8

我的方法:

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

使用this class加载应用程序启动时库(计划将分类器命名更改为GNU triplets):

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

是否可以使用普通的mvn install命令将.so与平台特定的分类器一起添加? – jbx 2012-04-12 20:33:42

+0

@jbx也许你的意思是'mvn deploy'?我仅将它用于由maven自己构建的java代码。我们的JNI代码没有maven构建,并通过简单的bash脚本通过cURL加载到Maven仓库。 – alexkasko 2012-04-12 20:41:50

+0

不,我的意思是mvn安装。我通常为不在maven存储库中的第三方库执行此操作。 http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html所以基本上我想要做的就是将第三方jar包括到.so中。 – jbx 2012-04-14 17:19:21