Используя Gradle с родной зависимости

Я пытаюсь использовать сигар в Gradle в проект. Распределение сигар по умолчанию предоставляется с 2 типами файлов:

  • банка, содержащая классы
  • некоторые родные файлы (.так, dylib нужна, .dll файлы)

моя цель-переупаковать эти файлы, чтобы я мог использовать их в качестве зависимостей, развернутых и загруженных по требованию из личного репозитория Maven.

моей первой попыткой было определить зависимости как файлы по порядку чтобы проверить, что мое приложение работает так, как ожидалось, прежде чем переупаковывать. Ниже приведен код Gradle, который я использовал для моего первого теста, который работает:

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

затем я переупаковал собственные файлы Sigar в банку и переименовал другой, чтобы соответствовать правилам для артефактов maven, так как я хочу развернуть их в репозитории Maven. Ниже то, что я получаю:

  • сигар-1.6.4.банку (содержит .class files)
  • sigar-1.6.4-родной.банку (содержит .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-приложением, как и для других зависимостей. любой Совет, комментарий, предложение, помощь, решение и т. д. добро пожаловать ;)

1 ответов


решение состоит в том, чтобы определить новую конфигурацию 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