Deployment 向tomcat部署大型*.war的最佳方法

Deployment 向tomcat部署大型*.war的最佳方法,deployment,tomcat,war,Deployment,Tomcat,War,在开发过程中,我经常需要将一个大型war文件(~45MB)部署到远程测试服务器上,通常我会使用scp将该文件复制到服务器上 WEB-INF/lib文件夹构成war文件的最大部分,其中包括所有必需的库(spring、ApacheCXF、hibernate等等) 现在我正在寻找一种快速简便的方法,只重新部署我修改过的文件 我如何确定webapp真正需要哪些软件包,因为spring和apachecxf附带了很多lib,我确信我不需要所有lib。我认为没有更快的方法只重新部署对WAR文件的更改 如果您以

在开发过程中,我经常需要将一个大型war文件(~45MB)部署到远程测试服务器上,通常我会使用scp将该文件复制到服务器上

WEB-INF/lib文件夹构成war文件的最大部分,其中包括所有必需的库(spring、ApacheCXF、hibernate等等)

现在我正在寻找一种快速简便的方法,只重新部署我修改过的文件


我如何确定webapp真正需要哪些软件包,因为spring和apachecxf附带了很多lib,我确信我不需要所有lib。

我认为没有更快的方法只重新部署对WAR文件的更改

如果您以分解的方式部署,您可以看到文件时间戳发生了什么变化,并相应地采取行动,但您必须编写代码才能做到这一点

我不知道OSGi是否能帮上忙。这将允许您将问题划分为更加独立和可交换的模块

只是好奇:

  • 现在需要多长时间
  • 您是否使用持续集成来构建和部署

  • 部署
    .war
    时,Tomcat要做的第一件事是将该文件解压缩到其
    webapps
    目录中,该目录位于与
    .war
    同名的子目录中

    在开发过程中,您显然可以访问
    .class
    文件、
    .jar
    文件、配置文件以及最终进入
    .war
    的任何其他文件。您可以轻松地建立受更改影响的一小部分文件。弄清楚这一点,然后使用脚本或
    ant
    任务或任何东西将这一小把文件直接复制到服务器上的
    webapps/yourapp
    目录中


    要使更改生效,您需要重新启动应用程序。如果Tomcat处于开发模式,强制重新加载(当然还有重新启动)的一个简单方法是更新
    WEB-INF/WEB.xml
    。因此,让您的部署过程
    触摸该文件或以其他方式更新该文件,使其具有一个新的时间戳,
    scp
    (最好作为您更新的最后一个文件)您应该可以快速轻松地重新加载。

    我要做的是从WAR中排除WEB-INF/lib/*.jar文件,并在服务器端重新组装。在我的例子中,这将一个60MB的WAR缩减到250k,从而允许真正快速的部署

    命令是排除jar的命令(参见ANT build的最后一段代码片段)

    在服务器端,很容易从精简的WAR中组装出一个完全填充的WAR:

  • 解压/分解由下面的ANT脚本创建的修剪过的战争
  • 将服务器存储库jar文件复制到分解的WEB-INF/lib中
  • 齐普陷入了一场新的(大规模的)战争
  • 像往常一样部署
  • 例如:

    unzip ../myapp.trimmed.war
    mkdir WEB-INF/lib
    cp ../war_lib_repository/* WEB-INF/lib
    zip -r ../myapp.war .
    
    也许不是最优雅的解决方案,但它节省了频繁部署大型战机的时间。我希望能和Maven一起做这件事,所以如果有人有建议,请让我知道

    ANT build.xml:

    
    

    我使用
    rsync
    将我的
    .war
    从本地机器复制到生产环境中。它通常提供一个大的加速,大约8-10倍

    另一个选项是使用
    git
    存储
    .war
    文件。当您推送一个新的
    .war
    时,只传输差异。也大大加快了速度。有人说git不是为存储大文件而设计的,它会变得很慢,而且工作不太好。事实上,回购协议将大幅增长,但在某些情况下,它可能是一个不错的选择

    一些数字:我的
    .war
    大约是50MB,当我部署一个新版本时,它只复制大约4MB,而不是上传一个完整的新war。同时使用
    git
    rsync

    更新:我遇到的问题是,git repo拥有多个
    .war
    版本后无法克隆,因为创建所有增量并将其传输到客户端将永远花费时间


    我改变了策略,将
    .war
    文件上传到dropbox中。Dropbox还使用一种
    rsync
    ,只复制增量。我从服务器上下载
    .war
    ,然后重新启动应用程序。希望这能有所帮助。

    改进Rori Stumpf的答案,这里有一个“细化”的渐变任务

    war {
        archiveName "v1.war"
    }
    
    task createThinWar(type: Copy) {
        dependsOn 'war'
    
        def tmpFolder = "${buildDir}/tmp/thin"
        def outputDir = "${buildDir}/libs"
    
        // Extract the war (zip) contents
        from zipTree("${outputDir}/v1.war")
        into "${tmpFolder}/v1"
    
        doLast {
            // Extracting the war third party libraries to a separate dir
            ant.move(file: "${tmpFolder}/v1/WEB-INF/lib", tofile: "${tmpFolder}/v1-libs")
    
            // Zip the third party libraries dir
            ant.zip(destfile: "${outputDir}/v1-libs.zip") {
                fileset(dir: "${tmpFolder}/v1-libs")
            }
    
            // Finally zip the thinned war back
            ant.zip(destfile: "${outputDir}/v1-thin.war") {
                fileset(dir: "${tmpFolder}/v1")
            }
        }
    }
    
    这将生成v1-thin.war(重量小于1mb)和一个libs zip


    将精简war部署到服务器(并在那里重建LIB),并在您修改版本/添加库时部署libs zip。

    最大的问题是上传到远程服务器的时间,它自己运行的部署快速而干净。我只能在远程服务器上测试hole webapp,因为webapp构建在一个拥挤而复杂的子系统上。
    rsync
    速度惊人!我的应用程序只需几秒钟,而不是5-7分钟。调试在本地计算机上的速度与本地计算机上的速度一样快。谢谢!
    war {
        archiveName "v1.war"
    }
    
    task createThinWar(type: Copy) {
        dependsOn 'war'
    
        def tmpFolder = "${buildDir}/tmp/thin"
        def outputDir = "${buildDir}/libs"
    
        // Extract the war (zip) contents
        from zipTree("${outputDir}/v1.war")
        into "${tmpFolder}/v1"
    
        doLast {
            // Extracting the war third party libraries to a separate dir
            ant.move(file: "${tmpFolder}/v1/WEB-INF/lib", tofile: "${tmpFolder}/v1-libs")
    
            // Zip the third party libraries dir
            ant.zip(destfile: "${outputDir}/v1-libs.zip") {
                fileset(dir: "${tmpFolder}/v1-libs")
            }
    
            // Finally zip the thinned war back
            ant.zip(destfile: "${outputDir}/v1-thin.war") {
                fileset(dir: "${tmpFolder}/v1")
            }
        }
    }