Gradle 'exclude' 来自子项目的基于本地 `fileTree` 的传递依赖

Gradle 'exclude' local `fileTree` based transitive dependency from sub-project

出于某些奇怪的原因,我在 gradle 类路径中使用基于本地文件树的 jar。

从子模块(项目)中,我想排除其中一个本地 jar。但是我缺少它的语法,有人可以提供正确的语法来排除本地 jar 文件作为此处的传递依赖项吗?

dependencies {
    implementation(project(":my-simple-project")) {
        exclude fileTree(dir: "../lib/", include: ["axis2-1.7.8/axis2-transport-http-1.7.8.jar"])
    }
   }

dependencies {
    implementation(project(":my-simple-project")) {
        exclude files("../lib/axis2-1.7.8/axis2-transport-http-1.7.8.jar"])
    }
   }

我收到一个错误,因为

* What went wrong:
A problem occurred evaluating project ':my-simple-project'.
> Could not find method exclude() for arguments [directory '../lib/'] on DefaultProjectDependency{dependencyProject='project ':my-simple-project'', configuration='default'} of type org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency.

您可以使用以下语法排除嵌套的 jar:

fileTree(dir: 'lib').exclude {details ->
    (details.file.canonicalPath.contains("axis2-1.7.8")
            && details.file.canonicalPath.contains('axis2-transport-http-1.7.8'))}

fileTree(dir: 'lib').exclude { details ->
        details.file.text.contains('axis2-transport-http')
}

参考:Gradle fileTree exclude all except certain directories

只能排除模块依赖,不能排除文件依赖。


如果您无法从 public 存储库(如 Maven Central 或 JCenter)解析您的依赖项,您可以创建一个本地 Maven 存储库(甚至在您的项目结构中)并直接从那里解析文件:

repositories {
    maven {
        url uri("${projectDir}/lib")
    }
}

dependencies {
    implementation 'org.apache.axis2:axis2-transport-http:1.7.8'
}

请注意,您必须修改 lib 文件夹中的目录结构以匹配 Maven 目录结构(或者定义具有自定义结构的 Ivy 存储库)。