首页 > 解决方案 > 如何从gradle中的目录创建war文件

问题描述

我正在编写一个任务来解压缩一个战争文件,删除一些罐子,然后从提取的文件夹中创建一个战争。

task unzipWar(type: Copy){
   println 'unzipping the war'
   def warFile = file("${buildDir}/temp/libs/webapps/service-app.war")
   def warOutputDir = file("$buildDir/wartemp")

   from zipTree(warFile)
   into warOutputDir
}

task deleteJars(type: Delete){
   println 'deleting the logging jars'    
   file("$buildDir/wartemp/WEB-INF/lib/slf4j-api-1.7.5.jar").delete();
   file("$buildDir/wartemp/WEB-INF/lib/logback-classic-1.1.7.jar").delete();
   file("$buildDir/wartemp/WEB-INF/lib/logback-core-1.1.7.jar").delete();   
}

task createWar(type: War){  
   destinationDir = file("$buildDir")
   baseName = "service-app"
   from "$buildDir/wartemp"
   dependsOn deleteJars
}

出于某种原因,jars 没有被删除,war 文件正在被创建,它只包含MANIFEST.MF,没有别的。我在这里想念什么?

标签: gradlewar

解决方案


首先要注意的是,您的createWar任务取决于deleteJars任务,但deleteJars不取决于unzipWar. 看来,如果您调用createWar任务,它不会调用unzipWar任务,也不会复制或删除任何内容。请注意,您有一个MANIFEST.MF文件,因为它是由createWar任务生成的。

第二件事是您试图在构建的配置阶段删除一些文件,尽管您unzipWar将在执行阶段完成它的工作。因此,您的删除任务将尝试在它们被解压缩之前删除这些文件。您可以在官方用户指南中阅读有关构建生命周期的信息。所以你需要重写你的deleteJars任务,正确配置它。看看文档,它有一个如何做的例子。

所以如果你打电话给

file("$buildDir/wartemp/WEB-INF/lib/slf4j-api-1.7.5.jar").delete();

它会在调用时尝试删除您的文件,因为它不是任务属性,而是配置中的操作。

要配置它,您必须执行以下操作:

task deleteJars(type: Delete) {
  delete "$buildDir/wartemp/WEB-INF/lib/slf4j-api-1.7.5.jar", "$buildDir/wartemp/WEB-INF/lib/logback-classic-1.1.7.jar", "$buildDir/wartemp/WEB-INF/lib/logback-core-1.1.7.jar"
}

推荐阅读