Подтвердить что ты не робот

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.

4b9b3361

Ответ 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"
}

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