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

时间:2013-07-24 20:11:44

标签: gradle

我们正在努力从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文件)时,它失败并显示错误:

  

转换课程   org.gradle.api.internal.file.collections.FileTreeAdapter to File using   toString()方法已被弃用,并计划删除   在Gradle 2.0中。请使用java.io.File,java.lang.String,   java.net.URL,或java.net.URI。

如果有人对此有具体建议,或者更好地“覆盖”战争文件,我真的很感激!

2 个答案:

答案 0 :(得分: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依赖项的过滤内容。作为标准战争任务的改变,依赖树保持清洁。到目前为止似乎对我们有用......

答案 1 :(得分:1)

如果您尝试在此处合并战争,则无法使用Copy任务/方法执行此操作。您将不得不使用Zip任务(没有等效方法)。如果您想要合并到现有战争中,执行此操作的方法是existingWar.from { zipTree(otherWar) }