Gradle:为什么ANT jar任务更快?

时间:2013-11-12 10:50:18

标签: java ant gradle

我有两种方法可以用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分钟。

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

1 个答案:

答案 0 :(得分:1)

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

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