12

Gradle プロジェクトでSigarを使用しようとしています。Sigar ディストリビューションには、デフォルトで 2 種類のファイルが用意されています。

  • クラスを含む 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;>

したがって、他の依存関係のようにネイティブ ファイルを取得して Java アプリにリンクするためのソリューションを探しています。アドバイス、コメント、提案、ヘルプ、解決策などは大歓迎です ;)

4

1 に答える 1

9

解決策は、目的の場所で JAR ファイルを解凍する新しい gradle 構成を定義することです。

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 に答える