将 Gradle 与本机依赖项一起使用
Using Gradle with native dependencies
我正在尝试在 Gradle 项目中使用 Sigar。 Sigar 发行版默认提供两种类型的文件:
- 一个包含 classes
的 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;>
因此,我正在寻找一种解决方案来获取 link 本机文件并将其传输到我的 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
我正在尝试在 Gradle 项目中使用 Sigar。 Sigar 发行版默认提供两种类型的文件:
- 一个包含 classes 的 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;>
因此,我正在寻找一种解决方案来获取 link 本机文件并将其传输到我的 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