2

我有两种方法可以用 gradle 创建一个胖罐子:

通过使用 ant 任务:

    jar {
       doLast {
          ant.jar(destFile: jar.archivePath, update: 'true') {
             configurations.compile.files.each { file ->
                zipfileset(src: file) {
                   exclude(name: '**/META-INF/maven')
                   exclude(name: '**/META-INF/maven/**/*')
                   exclude(name: '**/templates')
                   exclude(name: '**/about_files')
                   exclude(name: '**/about_files/**/*')
                   exclude(name: '**/*html')
                   exclude(name: '**/*readme*')
                   exclude(name: '**/*txt')
                   exclude(name: '**/*inf')
                   exclude(name: '**/*SF')
                   exclude(name: '**/*RSA')
                   exclude(name: '**/*.vm')
                   exclude(name: '**/empty.file')
                }
             }
          }
       }
    }

通过使用 gradle 方式:

    jar {
       dependsOn configurations.compile
       from (configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {
          exclude '**/META-INF/maven'
          exclude '**/META-INF/maven/**/*'
          exclude '**/templates'
          exclude '**/about_files'
          exclude '**/about_files/**/*'
          exclude '**/*html'
          exclude '**/*readme*'
          exclude '**/*txt'
          exclude '**/*inf'
          exclude '**/*SF'
          exclude '**/*RSA'
          exclude '**/*.vm'
          exclude '**/empty.file'
       }
    }

这两个任务都会创建一个相同的 jar 文件。但第一种方法需要 20 秒,第二种方法需要 3 分钟。

为什么第一个更快?除了执行时间:哪一个是“更清洁”的解决方案?还是有更聪明的方法来完成这项工作?

4

1 回答 1

1

前一个任务缺少一个dependsOn configurations.compile,这可以解释为什么执行这个任务更快。另一个主要区别是,仅对于第二个任务,任务输入被正确声明(即 Gradle 可以可靠地确定任务是否为),如果其中的文件很大up-to-date,这可能需要一段时间。configurations.compile

PS:第二个任务应该使用from { configurations.compile.collect { ... } },以避免在配置阶段做工作。这将加快不涉及该任务的构建调用。

于 2013-11-12T14:33:35.880 回答