Gradle为本机依赖项生成错误的eclipse类路径
我有一个Gradle项目,它依赖于Sigar库,它使用本机库(作为其可传递依赖项)。这是依赖关系树的相关片段:Gradle为本机依赖项生成错误的eclipse类路径,eclipse,gradle,sigar,Eclipse,Gradle,Sigar,我有一个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 | +--- s
+--- 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似乎没有认识到这些是本机lib,并将它们添加到eclipse类路径中,就像它们是常规的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
我怎样才能解决这个问题
编辑:
我尝试从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不再向Eclipse类路径添加dll
和so
文件,但仍然添加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
我对Gradle生成的Eclipse buildpath也有同样的问题,但我必须以以下方式调整(部分..
lib
文件不受尊重?)解决方案:
- 较新的Groovy版本需要从
到minusConfigurations+=configurations.natives
minusConfigurations+=[configurations.natives]
- 我有一个安装库的普通目录,而不是存储库。在
部分中,我使用依赖项
而不是本机文件
(仅在存储库中搜索)本机文件
build.gradle
apply plugin: 'application'
apply plugin: 'eclipse'
apply plugin: 'java'
我在eclipse和Gradle4.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)
}
}
}
}
我想您也不希望Gradle类路径上存在本机依赖项(至少不是所有依赖项)?当前如何声明
sigar
依赖关系?sigar依赖关系声明为compile(“sigar:sigar:2.0”)
。排除这些依赖项不是一个好的解决方案,但并不理想。问题只在于Eclipse。Gradle自己构建项目时没有问题。@PeterNiederwieser我试图从Eclipse类路径中排除本机依赖项(请参见我的编辑),但即使这样也不能像预期的那样工作。您能否再次检查您的解决方案是否只能部分工作(Gradle clean Eclipse
等)?我想不出一个解释,为什么它会删除一些文件,但不会删除其他文件。
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)
}
}
}
}