4

我们正在努力从 Maven 迁移到 Gradle。不幸的是,我们仍然需要处理一些战争叠加层。

作为一种解决方法,我试图将一个战争文件的内容复制到另一个文件中。

这是我到目前为止所拥有的:

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 文件)时,它会失败并出现错误:

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

如果有人对此有具体建议,或者有更好的“覆盖”战争文件的方法,我将不胜感激!

4

2 回答 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 依赖项的过滤内容。作为对标准战争任务的改变,依赖关系树保持干净。到目前为止,它似乎对我们有用......

于 2013-07-24T22:03:01.480 回答
1

如果您尝试在此处合并 Wars,则无法使用Copy任务/方法来执行此操作。你必须使用一个Zip任务(没有等效的方法)。如果您想合并到现有的战争中,这样做的方法是existingWar.from { zipTree(otherWar) }.

于 2013-07-24T20:38:51.753 回答