Gradle исключить определенные файлы внутри зависимости

Мне было интересно, если бы все равно было исключено, что определенные файлы, находящиеся внутри зависимостей (а не транзитивной зависимости), не загружаются.

Я переключаю сборку с Ant + Ivy на Gradle, и это было сделано в Айви раньше. Я спрашиваю, потому что у меня есть одна зависимость, которая содержит много скомпилированных баров wsdl в Artifactory, которые мы сбрасываем, но я не хочу загружать все банки в зависимости.

В Ivy он был настроен как:

Эти 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, нам нужно удалить модуль tomcat-starter из стандартного пакета загрузки Spring, и он выглядит очень похоже на что ты наделал. Однако в нашем коде говорится:

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

Я не проверял, не загружена ли соответствующая банка или нет в пути к классам, но я знаю, что она больше не используется.