Gradle генерирует неверный путь к классу затмения для собственных зависимостей
У меня есть проект Gradle, который зависит от библиотеки Sigar, которая использует собственные библиотеки (в качестве своих транзитивных зависимостей). Это соответствующий фрагмент дерева зависимостей:
+--- sigar:sigar:2.0
| +--- libsigar-amd64-linux:libsigar-amd64-linux:1.0
| +--- libsigar-ia64-linux:libsigar-ia64-linux:1.0
| +--- libsigar-x86-linux:libsigar-x86-linux:1.0
| +--- sigar-amd64-winnt:sigar-amd64-winnt:1.0
| \--- sigar-x86-winnt:sigar-x86-winnt:1.0
К сожалению, Gradle, похоже, не признает, что это нативные библиотеки, и добавляет их в classpath затмения, как они были обычными jar
s. Это вызывает ошибки в Eclipse:
Archive for required library: '/home/ghik/.gradle/caches/artifacts-23/filestore/libsigar-x86-linux/libsigar-x86-linux/1.0/so/c9af548445db750ad46e8beb3e77c58ff2315f3f/libsigar-x86-linux-1.0.so' in project 'myproject' cannot be read or is not a valid ZIP file
Archive for required library: '/home/ghik/.gradle/caches/artifacts-23/filestore/libsigar-ia64-linux/libsigar-ia64-linux/1.0/so/19d7aa37a3c40b6812a80eca518c6b81fd5c8416/libsigar-ia64-linux-1.0.so' in project 'myproject' cannot be read or is not a valid ZIP file
Archive for required library: '/home/ghik/.gradle/caches/artifacts-23/filestore/libsigar-amd64-linux/libsigar-amd64-linux/1.0/so/9481ceafe276c92327f8f3389c5e1c791eac6a81/libsigar-amd64-linux-1.0.so' in project 'myproject' cannot be read or is not a valid ZIP file
Archive for required library: '/home/ghik/.gradle/caches/artifacts-23/filestore/sigar-x86-winnt/sigar-x86-winnt/1.0/lib/1a608efcfd2e8358862b7dce02892fa98d63c97b/sigar-x86-winnt-1.0.lib' in project 'myproject' cannot be read or is not a valid ZIP file myproject
Archive for required library: '/home/ghik/.gradle/caches/artifacts-23/filestore/sigar-x86-winnt/sigar-x86-winnt/1.0/dll/14dfa28510c62eee00812e8d231f72ec69ac45b9/sigar-x86-winnt-1.0.dll' in project 'myproject' cannot be read or is not a valid ZIP file myproject
Archive for required library: '/home/ghik/.gradle/caches/artifacts-23/filestore/sigar-amd64-winnt/sigar-amd64-winnt/1.0/dll/b326449439e280c723ac45ada770a8d65a1272cc/sigar-amd64-winnt-1.0.dll' in project 'myproject' cannot be read or is not a valid ZIP file myproject
The project cannot be built until build path errors are resolved myproject
Как я могу это исправить?
РЕДАКТИРОВАТЬ:
Я пытался исключить нативные зависимости из classpath eclipse следующим образом:
configurations {
natives
compile.extendsFrom(natives)
}
eclipse {
classpath {
minusConfigurations += configurations.natives
...
}
}
dependencies {
...
compile("sigar:sigar:2.0")
natives("libsigar-amd64-linux:libsigar-amd64-linux:1.0")
natives("libsigar-ia64-linux:libsigar-ia64-linux:1.0")
natives("libsigar-x86-linux:libsigar-x86-linux:1.0")
natives("sigar-amd64-winnt:sigar-amd64-winnt:1.0")
natives("sigar-x86-winnt:sigar-x86-winnt:1.0")
...
}
Это работает только частично. Gradle больше не добавляет dll
а также so
файлы в Eclipse classpath, но все равно добавляет lib
файлы:
Archive for required library: '/home/ghik/.gradle/caches/artifacts-23/filestore/sigar-x86-winnt/sigar-x86-winnt/1.0/lib/1a608efcfd2e8358862b7dce02892fa98d63c97b/sigar-x86-winnt-1.0.lib' in project 'myproject' cannot be read or is not a valid ZIP file
1 ответ
У меня была та же проблема с Eclipse buildpath, сгенерированным Gradle, но мне пришлось адаптировать (частично.. lib
файлы не соблюдаются?) решение следующим образом:
- Более новые версии Groovy требуют адаптации от
minusConfigurations += configurations.natives
вminusConfigurations += [configurations.natives]
- У меня есть простой каталог, в котором установлена библиотека, а не хранилище. Это сработало для меня, чтобы использовать
native files
вместоnatives
(поиск только в репозиториях) внутриdependencies
раздел
build.gradle
выдержка с этими двумя изменениями:
apply plugin: 'application'
apply plugin: 'eclipse'
apply plugin: 'java'
..
configurations{
natives
compile.extendsFrom(natives)
}
sourceSets.main.compileClasspath += [configurations.provided]
eclipse {
classpath {
minusConfigurations += [configurations.natives]
}
}
dependencies {
native files('D:/lib/nativeDLL.dll')
}
У меня была похожая проблема с затмением и gradle 4.3. Я наконец нашел решение, думал, что поделюсь им со всеми вами:
eclipse {
classpath {
file {
whenMerged { classpath ->
java.util.List wanted = new java.util.ArrayList()
def entries = classpath.getEntries()
entries.each {
if (it.path.endsWith('.so')) {
println('Removing native library: ' + it.path + ' from eclipse classpath (unreadable to eclipse)')
} else {
wanted.add(it)
}
}
classpath.setEntries(wanted)
}
}
}
}