在開發過程中,我經常需要將一個大的war文件(〜45 MB)部署到遠程測試服務器,通常我使用scp將該文件複製到服務器。將大型* .war部署到tomcat的最佳方法
WEB-INF/lib文件夾構成了war文件的最大部分,它包含了所有必需的庫(spring,apache-cxf,hibernate等)。
現在我正在尋找一種快速簡單的方法來重新部署我的更改文件。
如何確定webapp真正需要哪些軟件包,因爲spring和apache-cxf帶有很多庫文件,我相信我不需要所有軟件包。
在開發過程中,我經常需要將一個大的war文件(〜45 MB)部署到遠程測試服務器,通常我使用scp將該文件複製到服務器。將大型* .war部署到tomcat的最佳方法
WEB-INF/lib文件夾構成了war文件的最大部分,它包含了所有必需的庫(spring,apache-cxf,hibernate等)。
現在我正在尋找一種快速簡單的方法來重新部署我的更改文件。
如何確定webapp真正需要哪些軟件包,因爲spring和apache-cxf帶有很多庫文件,我相信我不需要所有軟件包。
當部署.war
,第一件事Tomcat的確實是該文件解壓縮到其webapps
目錄,子目錄中的具有相同的名稱作爲您.war
。
在開發過程中,您顯然可以訪問您的.class
文件,.jar
文件,配置文件以及任何最終進入您的.war
的內容。您可以輕鬆地建立受您的更改影響的一小部分文件。如圖所示,然後使用腳本或ant
任務或其他任何方法將這些小部分文件直接複製到服務器上的webapps/yourapp
目錄中。
要看到您的更改生效,您需要重新啓動您的應用程序。如果Tomcat處於開發模式,則強制重新加載(當然重新啓動)的一種簡單方法是更新WEB-INF/web.xml
。因此,您的部署過程touch
該文件或以其他方式更新它的方式會給它一個新的時間戳,scp
(最好是更新的最後一個文件),並且您應該快速輕鬆地重新加載。
我不認爲有更快的方式來重新部署WAR文件的更改。
如果以分解方式進行部署,您可以看到文件時間戳已更改並採取相應措施,但您必須編寫代碼才能執行此操作。
我不知道OSGi是否可以在這裏幫忙。這將允許你將你的問題分成更獨立和可交換的模塊。
只是好奇:
我所做的是從WAR中排除WEB-INF/lib/*。jar文件並在服務器端重新組合。在我的情況下,這可以將60MB的WAR降低到250k,這可以實現真正的快速部署。
的<exclude name="**/lib/*.jar"/>
命令是什麼不包括JAR的(見ANT構建最後的代碼片段)
在服務器端,它很容易從修剪WAR組裝完全填充WAR:
例如:
unzip ../myapp.trimmed.war
mkdir WEB-INF/lib
cp ../war_lib_repository/* WEB-INF/lib
zip -r ../myapp.war .
也許不是最完美的解決方案,但它的宏大的戰爭的頻繁部署節省了時間。我希望能夠用Maven做到這一點,所以如果有人有任何建議,請讓我知道。
ANT的build.xml:
<property file="build.properties"/>
<property name="war.name" value="myapp.trimmedwar"/>
<property name="deploy.path" value="deploy"/>
<property name="src.dir" value="src"/>
<property name="config.dir" value="config"/>
<property name="web.dir" value="WebContent"/>
<property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
<property name="name" value="${war.name}"/>
<path id="master-classpath">
<fileset dir="${web.dir}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
<!-- other classes to include -->
<fileset dir="${birt.runtime}/ReportEngine/lib">
<include name="*.jar"/>
</fileset>
<pathelement path="${build.dir}"/>
</path>
<target name="build" description="Compile main source tree java files">
<mkdir dir="${build.dir}"/>
<javac destdir="${build.dir}" debug="true" deprecation="false" optimize="false" failonerror="true">
<src path="${src.dir}"/>
<classpath refid="master-classpath"/>
</javac>
</target>
<target name="createwar" depends="build" description="Create a trimmed WAR file (/lib/*.jar) excluded for size">
<!-- copy the hibernate config file -->
<copy todir="${web.dir}/WEB-INF/classes">
<!-- copy hibernate configs -->
<fileset dir="${src.dir}/" includes="**/*.cfg.xml" />
</copy>
<copy todir="${web.dir}/WEB-INF/classes">
<fileset dir="${src.dir}/" includes="**/*.properties" />
</copy>
<!-- copy hibernate classes -->
<copy todir="${web.dir}/WEB-INF/classes" >
<fileset dir="${src.dir}/" includes="**/*.hbm.xml" />
</copy>
<war destfile="${name}.war" webxml="${web.dir}/WEB-INF/web.xml">
<fileset dir="${web.dir}">
<include name="**/*.*"/>
<!-- exlude the jdbc connector because it's on the server's /lib/common -->
<exclude name="**/mysql-connector*.jar"/>
<!-- exclude these jars because they're already on the server (will be wrapped into the trimmed war at the server) -->
<exclude name="**/lib/*.jar"/>
</fileset>
</war>
<copy todir="${deploy.path}" preservelastmodified="true">
<fileset dir=".">
<include name="*.war"/>
</fileset>
</copy>
</target>
我用rsync
我.war
從我的本地機器複製到生產。它通常提供大約8-10倍的加速。
另一種選擇是使用git
來存儲.war
文件。當你git push
一個新的.war
,只有差異轉移。也是一個很大的加速。有人說git並不是爲存儲大文件而設計的,它變得緩慢並且效果不佳。實際上,回購會增長很多,但在某些情況下,這可能是一個不錯的選擇。
有些數字:我的.war
約爲50MB,當我部署一個新版本時,它僅複製大約4MB而不是上傳一場完整的新戰爭。與git
和rsync
。
更新:我碰到了它的問題是它有幾個.war
版本後,因爲它將採取永遠創建所有的增量,並將其發送給客戶端的混帳回購協議無法克隆。
我改變了策略,將.war
文件上傳到保管箱中。 Dropbox也使用rsync
種類,只複製deltas。從服務器我忘了.war
並重新部署應用程序。希望這可以幫助。
'rsync'非常快!只需幾秒鐘,而不是5-7分鐘爲我的應用程序。調試在本地計算機上一樣快。非常感謝! – 2014-04-19 00:28:07
最大的問題是上傳到遠程服務器的時間,它自我運行的部署快速而乾淨。我只能測試遠程服務器上的漏洞web應用程序,因爲Web應用程序構建的hudge和子系統複雜。 – Alex 2010-07-06 09:54:05