Gradle 排除依赖项中的特定文件

2022-08-31 22:37:59

我想知道是否无论如何都要从下载中排除特定文件,这些文件位于依赖项(不是可传递依赖项)中。

我正在将构建从Ant + Ivy切换到Gradle,这在Ivy之前已经完成。我问,因为我有一个依赖项,其中包含我们正在拉取的Artifactory中许多已编译的wsdl jar,但我不想下载依赖项中的所有jar。

在常春藤中,它的设置如下:

这 6 个项目发布到 Artifactory 的一个目录 repo/dep.location/example/7.3/jar 中。

<publications>
    <artifact name="foo-1-0" type="jar" />
    <artifact name="foo-1-0-async" type="jar" />
    <artifact name="foo-1-0-xml" type="jar" />
    <artifact name="bar-1-0" type="jar" />
    <artifact name="bar-1-0-async" type="jar" />
    <artifact name="bar-1-0-xml" type="jar" />
</publications>

这就是我如何只检索六个工件中的两个。

<dependency org="dep.location" name="example" rev="7.3"
            conf="compile,runtime">
    <include name="foo-1-0-async"/>
    <include name="foo-1-0-xml"/>
</dependency>

目前,如果我尝试在Gradle中执行类似操作,则会忽略排除项并下载所有六个项目。

compile (group:"dep.location", name:"example", version:"7.3")
{
    exclude module:'foo-1-0-xml'
    exclude module:'bar-1-0'
    exclude module:'bar-1-0-async'
    exclude module:'bar-1-0-xml'
}

我使用的是 Gradle 版本 1.8。


答案 1

我不认为Gradle有任何内置的支持来实现这一点,但你可以自己从类路径中清除工件。

受到Gradle论坛上这个帖子的启发,我想出了这个:

// The artifacts we don't want, dependency as key and artifacts as values
def unwantedArtifacts = [
    "dep.location:example": [ "foo-1-0-xml", "bar-1-0", "bar-1-0-async", "bar-1-0-xml"],
]

// Collect the files that should be excluded from the classpath
def excludedFiles = configurations.compile.resolvedConfiguration.resolvedArtifacts.findAll {
    def moduleId = it.moduleVersion.id
    def moduleString = "${moduleId.group}:${moduleId.name}:${moduleId.version}" // Construct the dependecy string
    // Get the artifacts (if any) we should remove from this dependency and check if this artifact is in there
    it.name in (unwantedArtifacts.find { key, value -> moduleString.startsWith key }?.value)
}*.file

// Remove the files from the classpath
sourceSets {
    main {
        compileClasspath -= files(excludedFiles)
    }
    test {
        compileClasspath -= files(excludedFiles)
    }
}

请注意,Gradle 可能仍会为您下载文件并缓存它们,但它们不应位于您的类路径中。


答案 2

我不确定这是否是你想要的,但是由于我们使用的是Spring Boot和Wildfly,我们必须从spring Boot标准包中删除tomcat-starter模块,它看起来与你所做的非常相似。但是,我们的代码指出:

configurations {
    compile.exclude module: "spring-boot-starter-tomcat"
}

我还没有检查相应的jar是否未下载或只是不在类路径上,但是我知道它不再使用。


推荐