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

Java 将Gradle与本机依赖项一起使用,java,gradle,build.gradle,build-dependencies,Java,Gradle,Build.gradle,Build Dependencies,我正在尝试在Gradle项目中使用。默认情况下,Sigar分发版提供了两种类型的文件: 包含类的JAR 一些本机文件(.so,dylib,.dll) 我的目的是重新打包这些文件,以便将它们用作从个人Maven存储库按需部署和下载的依赖项 我的第一次尝试是将依赖项定义为文件,以便在重新打包之前检查我的应用程序是否按预期工作。下面是我在第一次测试中使用的Gradle代码: dependencies { compile files("${rootDir}/lib/sigar/sigar.jar

我正在尝试在Gradle项目中使用。默认情况下,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
时,会获取新的依赖项,但在运行时无法再找到本机库,因为现在我遇到以下异常:

Error thrown in postRegister method: rethrowing <java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Sigar.getCpuInfoList()[Lorg/hyperic/sigar/CpuInfo;>
postRegister方法中引发的错误:重试
因此,我正在寻找一种解决方案来获取本机文件并将其链接到我的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