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"
}
Я не проверял, не загружена ли соответствующая банка или нет в пути к классам, но я знаю, что она больше не используется.