Deployment 向tomcat部署大型*.war的最佳方法
在开发过程中,我经常需要将一个大型war文件(~45MB)部署到远程测试服务器上,通常我会使用scp将该文件复制到服务器上 WEB-INF/lib文件夹构成war文件的最大部分,其中包括所有必需的库(spring、ApacheCXF、hibernate等等) 现在我正在寻找一种快速简便的方法,只重新部署我修改过的文件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文件的更改 如果您以
我如何确定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")
}
}
}