2015-04-03 112 views
7

我正在嘗試在Gradle項目中使用Sigar。 SIGAR分佈是由設置有2種類型的文件的默認:對本地依賴項使用Gradle

  • 包含類的JAR
  • 一些本地文件(。所以,dylib,.DLL)

我的目的是重新包裝這些以便我可以將它們用作從個人Maven存儲庫按需部署和下載的依賴項。

我的第一個嘗試是將依賴關係定義爲文件,以便檢查我的應用程序是否按照預期的那樣在重新打包前工作。下面是我用我的第一次測試的搖籃代碼工作:

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

然後,我已經重新包裝SIGAR本地文件到一個JAR,並更名爲另外一個,因爲我希望他們在部署到匹配行家文物規則一個Maven倉庫。下面是我得到:

  • SIGAR-1.6.4.jar(包含.class文件)
  • SIGAR-1.6.4-native.jar(包含名爲.dylib,。所以,在.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;> 

因此,我正在尋找解決方案來獲取並鏈接本機文件到我的Java應用程序,就像其他依賴項一樣。任何建議,意見,建議,幫助,解決方案等,歡迎;)

回答

7

一種解決方法是定義一個新配置的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