将Gradle与本机依赖项一起使用

我想在Gradle项目中使用Sigar 。 默认情况下,Sigar分发提供了两种类型的文件:

  • 包含类的JAR
  • 一些原生文件(.so,dylib,.dll)

我的目的是重新打包这些文件,以便我可以将它们用作从个人Maven存储库按需部署和下载的依赖项。

我的第一次尝试是将依赖项定义为文件,以便在重新打包之前检查我的应用程序是否按预期工作。 下面是我用于第一次测试的Gradle代码:

dependencies { compile files("${rootDir}/lib/sigar/sigar.jar") runtime fileTree(dir: "${rootDir}/lib/sigar/", exclude: "*.jar") } 

然后,我将Sigar本机文件重新打包到JAR中并重命名另一个以匹配maven工件的规则,因为我想将它们部署在Maven存储库中。 以下是我得到的:

  • sigar-1.6.4.jar(包含.class文件)
  • sigar-1.6.4-native.jar(在根目录下包含.dylib,.so和.dll文件)

下一步是在我的自定义存储库中部署这些文件。 然后,我更新了我的build.gradle ,如下所示:

 dependencies { compile 'sigar:sigar:1.6.4' runtime 'sigar:sigar:1.6.4:native' } 

不幸的是,当我进行gradle clean build ,会获取新的依赖项,但在运行时无法再找到本机库,因为现在我得到以下exception:

 Error thrown in postRegister method: rethrowing  

因此,我正在寻找一种解决方案来获取和链接本机文件到我的Java应用程序,就像其他依赖项一样。 欢迎任何建议,评论,建议,帮助,解决方案等;)

解决方案是定义一个新的gradle配置,在所需位置解压缩JAR文件:

 project.ext.set('nativeLibsDir', "$buildDir/libs/natives") configurations { nativeBundle } dependencies { nativeBundle 'sigar:sigar:1.6.4:native' } task extractNativeBundle(type: Sync) { from { configurations.nativeBundle.collect { zipTree(it) } } into file(project.nativeLibsDir) } dist.dependsOn extractNativeBundle 

然后,必须将此位置放在java.library.path以用于依赖于本机库的任务:

 systemProperty "java.library.path", project.nativeLibsDir 
Interesting Posts