如何使用Gradle更新现有的War / Jar / Zip文件?

时间:2015-01-27 16:33:03

标签: java-ee gradle

我需要制作现有war文件的副本并更新其中的xml文件。 我对如何做到这一点的想法是:

  • 从现有战争中提取文件
  • 替换文件
  • 中的字符串
  • 复制战争
  • 将修改后的文件添加回复制的战争

我可以使用Gradle执行前3个步骤,但我只能弄清楚如何使用Ant执行最后一步。

task updateWar() << {
    def originalWar = file("deploy/mywar.war")
    def outputDir = file("deploy")
    def wars = [ "war1", "war2" ]
    wars.each() { warFile ->        
        delete "deploy/WEB-INF/ejb.xml"
        copy {
            //Step 1
            from(zipTree(originalWar)) {
                include 'WEB-INF/ejb.xml'
            }
            into outputDir
            //Step 2
            filter{
                String line -> line.replaceAll("<value>OriginalText</value>",
                        "<value>UpdatedText</value>")
            }
        }
        //Step 3
        copy {
            from outputDir
            into outputDir
            include 'mywar.war'
            rename 'mywar.war',"${warFile}.war"
        }       
        //Step 4
        ant.jar(update: "true", destfile: deploy/${warFile}.war") {
            fileset(dir: deploy", includes: 'WEB-INF/**')
        }
    }
}

理想情况下,会有一个过滤器选项,允许我在复制时修改指定的文件,但我还没有解决这个问题。

如何在Gradle中有效地执行此操作而不回退到Ant?甚至是一个常规的gradle方式一步到位吗?

编辑: 我离得更近了。使用原始战争中的ziptree的Zip任务是第一个关键步骤。 filesMatching与过滤器相结合是秘密的酱油!但是,我无法在循环中使用它,就像我可以使用复制方法一样,所以我仍然坚持:(

task updateWar(type: Zip) {
    def originalWar = file("deploy/mywar.war")
    def outputDir = file("deploy")
    archiveName = "war2.war"
    destinationDir = outputDir
    from (zipTree(originalWar),{
        filesMatching("WEB-INF/ejb.xml") {
            filter{
                String line -> line.replaceAll("<value>OriginalText</value>",
                        "<value>UpdatedText</value>")
            }
        }
    })
}

1 个答案:

答案 0 :(得分:0)

假设您只想用war文件夹中的一个文件替换res中的原始文件,请按以下步骤操作:

task updateWar(type: Zip) {
    def originalWar = file("deploy/mywar.war")

    archiveBaseName = 'mywar'
    archiveExtension = 'war'

    from(zipTree(originalWar)) {
        // Remove the original ejb.xml if it exists
        exclude("**/WEB-INF/ejb.xml")
    }

    // Include our own ejb.xml
    from('res/ejb.xml') {
        into('WEB-INF/')
    }
}