Извлечение конкретных JAR-файлов из зависимостей

Я новичок в учебе, но учусь быстро. Мне нужно получить определенные JAR-файлы из logback в новый каталог в моей задаче выпуска. Зависимости разрешаются нормально, но я не могу понять, как в задаче выпуска извлечь просто logback-core-1.0.6.jar и logback-access-1.0.6.jar в каталог с именем 'lib/ext ". Вот соответствующие выдержки из моего build.gradle.

dependencies {
    ...
    compile 'org.slf4j:slf4j-api:1.6.4'
    compile 'ch.qos.logback:logback-core:1.0.6'
    compile 'ch.qos.logback:logback-classic:1.0.6'
    runtime 'ch.qos.logback:logback-access:1.0.6'
    ...
}
...
task release(type: Tar, dependsOn: war) {
    extension = "tar.gz"
    classifier = project.classifier
    compression = Compression.GZIP

    into('lib') {
        from configurations.release.files
        from configurations.providedCompile.files
    }

    into('lib/ext') {
        // TODO:  Right here I want to extract just logback-core-1.0.6.jar and logback-access-1.0.6.jar
    }
    ...
}

Как перебрать зависимости, чтобы найти эти конкретные файлы и поместить их в каталог lib / ext, созданный в ('lib/ext')?

2 ответа

Решение

Конфигурации - это просто (ленивые) коллекции. Вы можете перебирать их, фильтровать и т. Д. Обратите внимание, что обычно вы хотите делать это только на этапе выполнения сборки, а не на этапе настройки. Приведенный ниже код достигает этого, используя ленивый метод FileCollection.filter(). Другим подходом было бы передать закрытие методу Tar.from().

task release(type: Tar, dependsOn: war) {
    ...
    into('lib/ext') {
        from findJar('logback-core') 
        from findJar('logback-access')
    }
}

def findJar(prefix) { 
    configurations.runtime.filter { it.name.startsWith(prefix) }
}

Ничего не стоит, что принятый ответ фильтрует Configuration как FileCollection поэтому в коллекции вы можете получить доступ только к атрибутам файла. Если вы хотите фильтровать саму зависимость (по группе, имени или версии), а не по имени файла в кэше, вы можете использовать что-то вроде:

task copyToLib(type: Copy) {
  from findJarsByGroup(configurations.compile, 'org.apache.avro')
  into "$buildSrc/lib"
}

def findJarsByGroup(Configuration config, groupName) {
  configurations.compile.files { it.group.equals(groupName) }
}

files принимает Зависимость SpecClosure, которая является просто функцией фильтра на Dependencyсм.: https://gradle.org/docs/current/javadoc/org/gradle/api/artifacts/Dependency.html

Другие вопросы по тегам