在Gradle中将文件从一个Zip文件复制到另一个Zip文件

4
我们正在从Maven迁移到Gradle。不幸的是,我们仍然需要处理一些War叠加包。
作为解决方法,我正在尝试将一个war文件的内容复制到另一个war文件中。
目前为止,我已经完成了以下工作:
task overlayWars (dependsOn: war) << {
    // Get the source war files to copy the contents from...
    def dependencyWars = configurations.runtime.filter { it.name.endsWith ('.war') }
    dependencyWars.each { dependentWar ->

        // Get the products, ie the target war file...
        war.outputs.files.each { product ->
            println "Copying $dependentWar contents into $product"
            copy {
                from { zipTree (dependentWar) }
                into { zipTree (product)}   // this seems to be the problem
                include 'WEB-INF/classes/**/*.class'
                include 'WEB-INF/jsp/**/*.jsp'
            }
        }
    }
}

当使用into { zipTree (product)}插入文件(如file ('tmp/whatever'))时,这个操作可以正常运行。当指定另一个zip文件(目标war文件)时会出现以下错误:

Converting class org.gradle.api.internal.file.collections.FileTreeAdapter to File using toString() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use java.io.File, java.lang.String, java.net.URL, or java.net.URI instead.

如果有人对此有具体的建议或更好的方法来“覆盖”war文件,我将非常感激!
2个回答

5
在追查几个不同的方向后,我最终得出了这个结论:
war {
    configurations.runtime.filter { it.name.endsWith ('.war') }.each {
        from zipTree (it).matching {
            include 'WEB-INF/classes/**/*.class'
            include 'WEB-INF/jsp/**/*.jsp'
            include 'images/**'
        }
    }
}

基本上,我只是在产品中包含任何.war依赖项的过滤内容。作为标准war任务的修改,依赖树保持清洁。到目前为止,这对我们来说似乎可行...


非常感谢你的出色回答,你帮我省了很多时间!这个模式非常灵活,我只需要包含一些来自以前是依赖项目但现在已经单独发布的资源即可。 - JoeG

1

如果您想在此处合并Wars,您不能使用Copy任务/方法。您必须使用Zip任务(没有等效的方法)。如果您想将其合并到现有的War中,则可以使用以下方式:existingWar.from { zipTree(otherWar) }


感谢您的反馈 - 您是完全正确的。顺便问一下,您如何从文件系统中的 .war 创建一个“existingWar”?我知道如何创建一个新的,但不知道如何引用/加载现有的... - node42
你不能这样做。你需要创建一个“Zip”任务并合并Wars文件。 - Peter Niederwieser
请问您能否提供一个完整的示例来说明如何做到这一点? - opticyclic
@PeterNiederwieser - 是的,一个可工作的例子会非常有帮助。谢谢! - Parag Doke

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