如何在Gradle中创建包含项目JAR和war的分发存档(zip)

如何在Gradle中创建包含项目JAR和war的分发存档(zip),gradle,Gradle,我正在尝试创建一个Zip任务,该任务将为我的项目创建一个分发包,其中包含项目jar文件和war(以及由assemble任务生成的其他构建工件) 所以我试着写这个简单的脚本 task dist(dependsOn: 'assemble', type: Zip){ into('lib'){ from 'build/libs' //contains jar and war files } ... //other stuff } 任务dist依赖于assembly,因为它方便地包含

我正在尝试创建一个Zip任务,该任务将为我的项目创建一个分发包,其中包含项目jar文件和war(以及由
assemble
任务生成的其他构建工件)

所以我试着写这个简单的脚本

task dist(dependsOn: 'assemble', type: Zip){
  into('lib'){
    from 'build/libs' //contains jar and war files
  }
  ... //other stuff
}
任务
dist
依赖于
assembly
,因为它方便地包含了创建jar和war文件的任务

但如果我尝试执行此操作,gradle会抱怨此错误消息:

Circular dependency between tasks. Cycle includes [task ':assemble', task ':dist'].
我已经签出了,上面清楚地写着,
assembly
任务自动
dependsOn
项目中的所有归档任务,其中显然包括我的
dist
任务。而且似乎没有办法绕过它

在gradle这样做的正确方式是什么?如何创建依赖于
assembly
任务的zip任务?我可以使
dist
任务显式地依赖于
jar
war
任务,但我认为这有点违反了封装

我正在使用gradle-1.0-milestone-3


提前谢谢

您可以执行以下操作,将生成的所有已创建归档文件放入您的dist zip中:

task dist(type:Zip){
    tasks.withType(AbstractArchiveTask).each{ archiveTask ->
        if(archiveTask!=dist){
            from archiveTask.outputs.files
        }
    }
}

下面是一个完整的示例,它可以让您的Zip依赖于jar和war任务:

task dist(type:Zip){
    from jar.outputs.files
    from war.outputs.files
}

好主意,但相当冗长。如果我有另一个类似的
dist2
任务,它也会中断。你能解释一下第二个dist2任务会中断什么吗?if子句只是为了避免循环。我的意思是,如果我有另一个分发任务(
dist2
),它的输出文件将包含在
dist
中,而我只需要
assemble
的输出(即
jar
war
)。事实上,
archiveTask.outputs.files的内容对我来说并不重要。我只想确保
jar
war
任务在
dist
task之前执行。在这种情况下,您应该将上面的示例用于
任务。withType(jar)
作为war从jar继承的。谢谢。看起来不错,但它不也包括我zip中所有Jar任务的内容吗?(我回家后再试试)。最初我想要的是制作一个分发包,其中只包含
jar
war
任务的输出。您的解决方案现在应该可以做到这一点,但是如果我以后添加一些辅助jar任务,它们可能会出现在我的zip中。对不起,我以为您指的是jar和War类型的所有任务。我重构了上面的示例以满足您的需要。我希望我们更接近一个合适的解决方案:-)