当前位置: 首页 > 知识库问答 >
问题:

Gradle:为每个war从现有war中删除一些文件-文件do:unpack,remove/filter,assemble war

贺高飞
2023-03-14

我对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)

我假设我将创建一个新任务并添加一些“依赖”声明。

task excludeUnwantedFiles(){

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

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

如何创建为每个WAR文件执行的任务?做这件事最好的方法是什么?

有什么办法能让我在一个任务中完成这件事吗?例如。使用zipTree(foobarwithfile.war)作为“from”和“war(foobarwithoutfile.war)”并在两者之间应用筛选器?

感谢Lance Java为您提供解决方案。

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

我的解决办法是使用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个答案

阎辰钊
2023-03-14

我会为每个war文件创建一个zip任务,并通过让assemble依赖于所有任务,将所有任务连接到DAG中

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 
}
 类似资料:
  • 我正在使用gradle构建一个Spring Boot应用程序,我希望从war中删除文件,因为该文件将从外部加载(它运行在tomcat容器中,而不是嵌入式的)。 我查看了StackOverflow和Gradle文档,试图找出该做什么,但我不知道该绑定到哪个阶段,以及在创建war之前还是之后排除该文件。处理文件似乎也有多种方法。 我相信Maven使用作为等价物。

  • 我有两个war文件要部署在tomcat中的一个linux服务器中。考虑到只有一台linux服务器,我有两种方法来部署它们。 > 在一个tomcat中部署两个war文件。内存分配将在两个war文件实例之间共享 B.部署任何一个war文件都意味着这两个文件都要停机 在两个不同的Tomcat实例中部署两个war文件。必须分别为每个Tomcat分配内存。这意味着,如果第一个war文件在某些时间占用更多内存

  • 我正在尝试替换用Gradle生成的WAR文件中的一个文件。

  • 那么如何防止插件jar进入war文件呢?多谢了。

  • 使用Ant创建WAR文件非常简单,与创建JAR文件任务非常相似。 毕竟,WAR文件,就像JAR文件只是另一个ZIP文件。 WAR任务是JAR任务的扩展,但它有一些很好的补充,可以操作进入WEB-INF/classes文件夹的内容,并生成web.xml文件。 WAR任务对于指定WAR文件的特定布局很有用。 由于WAR任务是JAR任务的扩展,因此JAR任务的所有属性都适用于WAR任务。 Sr.No.

  • 我正在改变我们的项目,以使用gradle作为构建工具,但正在与2个问题斗争;