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

Извлечение определенных JAR из зависимостей

Я новичок в gradle, но быстро обучаюсь. Мне нужно получить некоторые JAR файлы из журнала в новый каталог в моей задаче выпуска. Зависимости разрешаются нормально, но я не могу понять, как в задаче release извлекать только 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)?

4b9b3361

Ответ 1

Конфигурации - это просто (ленивые) коллекции. Вы можете перебирать их, фильтровать и т.д. Обратите внимание, что вы обычно хотите делать это только на этапе выполнения сборки, а не на этапе конфигурации. Код ниже достигает этого, используя ленивый 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) }
}

Ответ 2

Нет ничего, что принятый ответ фильтрует 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