我需要制作一个现有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/**')
}
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,应该有一个过滤器选项,允许我在复制时修改指定的文件,但尚未完成。
您如何在Gradle中有效地做到这一点而又不退回Ant?一步一步就能做到吗?
编辑:我已经接近。第一步是使用原始战争中的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>")
}
}
})
}
Run Code Online (Sandbox Code Playgroud)
假设您只想用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/')
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2605 次 |
| 最近记录: |