2017-03-10 55 views
0

我对gradle比较新,所以这可能是一个典型的newbee问题。Gradle:从现有的战争中删除一些文件|对于每个战争文件做:解压缩,删除/过滤器,组装战争

在我们的gradle构建中,我们有一组war文件(依赖关系),它们都包含一个我们需要从构建我们的ear文件之前从这些war文件中删除的文件。

如何能够做到以下几点:

- for all war files in a folder, 
    - extract war content to a location (using a Copy task & zipTree) 
    - re-pack to a new war applying a filter (using War & excludes) 

我想我将创建一个新的任务,并添加一些“dependsOn”声明。

task excludeUnwantedFiles(){ 

    file(directoryWithOriginalWars).eachFile { file -> 
     ???? unpack war, filter, assemble new war file ???? 
    } 
} 

ear.dependsOn(excludeUnwantedFiles) 
excludeUnwantedFiles.dependsOn(downloadAllOriginalWarsIntoDirectory) 

如何创建该任务,执行每个战争文件?做这个的最好方式是什么?

有一种方法可以在一项任务中完成此任务吗?例如。复制任务并使用zipTree(fooBarWithFile.war)作为'from'和'war(fooBarWithoutFile.war)',并在两者之间应用过滤器?

或者这是要走的路,只是一个循环? Delete/Remove file from war with Gradle

任何帮助,高度赞赏! 干杯, d。

--------- UPDATE -------------------

感谢名单兰斯的Java为您的解决方案。

正如我在我的评论中提到的,我面临的问题是战争文件在执行期间被下载/提取,因此无法在配置时定义新任务。

我的解决方法是使用tarTree(带过滤器)来访问尚未提取的war文件列表。请参阅下面我的代码示例:

def warFileSourceTarGz = '...tar.gz' 
def nfsLibDir="$buildDir/dependencies/" 
def nfsLibDownloadDir="$buildDir/downloadedDependencies/" 

// task that downloads & extracts the tar.gz 
task fetchNfsDependencies(type: Copy) {    
    from tarTree(warFileSourceTarGz) 
    into nfsLibDownloadDir  
} 


// loop through all war files inside the tar.gz and 
// create a task to remove unwanted libraries for each war 
task excludeUnwantedJarsFromWars(dependsOn: fetchNfsDependencies){ 

    // access the "remote" tar.gz file to get the list of war-files to loop over 
    def warFileSource = tarTree(warFileSourceTarGz).matching{ 
      include '*.war' 
    } 

    // for every war-file, create an exclude-path  
    warFileSource.visit { nextWarFile -> 

     if(nextWarFile.name.endsWith('.war')) { 

      String taskName = "excludeUnwantedJarsFrom_${nextWarFile.name.replace('.war', '')}" 
      String nextWarFilePath = nfsLibDownloadDir+"/"+nextWarFile.name 

      Zip tweakWarTask = tasks.create(name: taskName, type: Zip, dependsOn: fetchNfsDependencies) { 

       from zipTree(nextWarFilePath) 
       destinationDir = file(nfsLibDir) 
       archiveName = nextWarFile.name 

       // exclude these jars, as they cause classloading problems in our ear deployment. 
       exclude 'WEB-INF/lib/jcan-optrace*' 
      }  

      // hook into build-process 
      ear.dependsOn(tweakWarTask) 
     } 
    } 
} 

ear.dependsOn(excludeUnwantedJarsFromWars) 

回答

1

我具有assemble创建每个war文件和线材的所有任务到DAG中的Zip任务依赖于它们的所有

FileTree warFiles = fileTree(dir: 'path/to/wars', includes: ['**/*.war']) 
warFiles.files.each { File warFile -> 
    String taskName = "tweakWar${warFile.name.replace('.war', '')}" 
    Zip tweakWarTask = tasks.create(name: taskName, type: Zip) { 
     from zipTree(warFile) { 
      exclude 'path/to/some/file.xml' 
     } 
     destinationDir = "$buildDir/tweakedWars" 
     archiveName = warFile.name 
    } 
    // wire the task into the dag 
    assemble.dependsOn tweakWarTask 
} 
+0

Thaks很多关于这个建议。我意识到我忘了提到我想要处理的战争文件是在构建过程中下载的。所以上面的解决方案只适用于第二个exceution =>当战争文件已经存在于文件夹中时。我怎样才能让生成的任务在同一个版本中创建和执行? – Dominik

+0

您可以创建一个新的配置(例如'wars')并将战争依赖关系添加到'wars'配置中。您可以在我的示例中迭代'configurations.wars'而不是'fileTree' –