15

我是 gradle 新手,但学习很快。我需要从 logback 中获取一些特定的 JAR 到我的发布任务中的新目录中。依赖关系解决得很好,但我不知道如何在发布任务中将 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
    }
    ...
}

如何遍历依赖项以找到这些特定文件并将它们放入由 into('lib/ext') 创建的 lib/ext 目录中?

4

2 回答 2

21

配置只是(惰性)集合。您可以对它们进行迭代、过滤等。请注意,您通常只想在构建的执行阶段执行此操作,而不是在配置阶段。下面的代码通过使用惰性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) }
}
于 2012-07-02T16:52:37.110 回答
9

接受的答案在集合中过滤是毫无价值的ConfigurationFileCollection因此您只能访问文件的属性。如果您想过滤依赖项本身(组、名称或版本)而不是缓存中的文件名,那么您可以使用以下内容:

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需要一个dependencySpecClosure,它只是一个过滤器函数Dependency,参见:https ://gradle.org/docs/current/javadoc/org/gradle/api/artifacts/Dependency.html

于 2015-02-07T10:15:08.617 回答