12

我正在尝试在 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'
}

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

Error thrown in postRegister method: rethrowing <java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Sigar.getCpuInfoList()[Lorg/hyperic/sigar/CpuInfo;>

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

4

1 回答 1

9

一种解决方案是定义一个新的 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
于 2015-04-04T09:01:51.290 回答