当前位置: 首页 > 知识库问答 >
问题:

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

荣沈义
2023-03-14
<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个答案

郗俊能
2023-03-14

我不认为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可能仍然会下载文件并为您缓存它们,但它们不应该在您的类路径中。

 类似资料:
  • 是否有一种方法可以使用Gradle从一组中排除特定的jar?我尝试了下面的代码,但这删除了该组的所有jar

  • 问题内容: 我遇到一个问题,其中同一类的多个版本显示在我的类路径中。有问题的班级是。我要使用的版本由引入。但是,我们还使用了Jira rest客户端库,该库依赖于较旧版本的jersey(),该版本包含捆绑在jar中的java.ws软件包。 这是构建文件中的示例片段: 我无法删除它,因为它使用了与新版本不同的软件包名称,并且会导致在Jira客户端中找不到类def的异常。 据我所知,目前我的选择是:

  • 我想使用Maven创建一个jar,它包含一个特定的依赖工件,并排除一些源java文件。 当前我使用以下代码段: 因此,jar中确实包含了“Guava”工件文件,但是我也希望排除一些源文件(例如src/main/java/my.package/下的特定文件),我该如何做呢?

  • 我正在使用“maven”插件将Gradle构建创建的工件上传到Maven中央存储库。我正在使用类似于以下任务的任务: 然而,此任务创建的POM文件不能正确报告在我的Gradle构建文件中被排除的依赖项。例如: 如何在生成的POM文件中正确管理排除的依赖项?

  • 我在Jetty上使用Spring Boot,似乎我不能在Gradle构建文件中排除所有的Tomcat依赖项。 build.gradle的相关部分: 然而,当我运行时,Tomcat的一部分仍然存在,并导致WebSocket出现问题: 为什么< code > spring-boot-starter-Tomcat 没有被排除在< code > spring-boot-starter-web 之外?

  • 我遇到了一个我一直无法解决的特殊问题,如果有任何帮助,我将不胜感激。最初,我在Java项目中包含了一些jar依赖项作为工件依赖项。它看起来如下所示: 到目前为止还好。让我们把这个项目叫做'A'。我已经将项目A包含在另一个Java项目B中,同样是用Gradle。我注意到,当在B中使用一个带有maven-publish的published时,它在pom文件中并没有排除所有的传递依赖项。 所以我开始使用