如何在Gradle中创建包含项目jar和war的分发归档文件(zip)

7
我正在尝试创建一个Zip任务,用于创建一个分发包,其中包含项目jar文件和war文件(以及可能由“assemble”任务产生的其他构建工件)。

因此,我尝试编写这个简单的脚本。

task dist(dependsOn: 'assemble', type: Zip){
  into('lib'){
    from 'build/libs' //contains jar and war files
  }
  ... //other stuff
}

任务dist依赖于assemble,因为它方便地包括创建jar和war文件的任务。
但是如果我尝试执行它,Gradle会报以下错误消息:
Circular dependency between tasks. Cycle includes [task ':assemble', task ':dist'].

我已经查看了assemble任务的规范,其中明确写道assemble任务自动依赖于项目中所有归档任务,显然包括我的dist任务。似乎没有绕过它的方法。
在gradle中,正确的做法是什么?如何创建一个zip任务来依赖assemble任务?我可以让dist任务显式地依赖jar和war任务,但我认为这有点违反封装原则。
我正在使用gradle-1.0-milestone-3。
提前感谢!
2个回答

13

这里有一个完整的示例,可以使你的Zip取决于jar和war任务:

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

谢谢。看起来不错,但是它是否也会包括我zip文件中所有Jar任务的内容呢?(我回家后会试一下)。最初我想要的是创建一个分发包,其中仅包含jarwar任务的输出。你的解决方案现在应该可以解决问题,但如果我稍后添加一些辅助的jar任务,似乎它们可能会出现在我的zip文件中。 - rodion
抱歉,我误以为您指的是所有类型为Jar和War的任务。我已经重构了上面的示例以满足您的需求。希望我们能更接近一个合适的解决方案 :-) - Rene Groeschke

0

您可以执行以下操作将构建的所有已创建存档文件添加到您的 dist zip 中:

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

好主意,但是有点啰嗦。而且如果我有另一个类似的 dist2 任务,它就会出错。 - rodion
你能解释一下第二个dist2任务会出现什么问题吗?if子句只是为了避免循环。 - Rene Groeschke
我的意思是,如果我有另一个分发任务(dist2),它的输出文件将包含在dist中,而我只想要assemble的输出(即jarwar)。实际上,archiveTask.outputs.files的内容对我来说并不重要。我只想确保在执行dist任务之前先执行jarwar任务。 - rodion
在这种情况下,您应该使用上面的示例tasks.withType(Jar),因为War继承自Jar。 - Rene Groeschke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接