2010-07-06 59 views
10

在開發過程中,我經常需要將一個大的war文件(〜45 MB)部署到遠程測試服務器,通常我使用scp將該文件複製到服務器。將大型* .war部署到tomcat的最佳方法

WEB-INF/lib文件夾構成了war文件的最大部分,它包含了所有必需的庫(spring,apache-cxf,hibernate等)。

現在我正在尋找一種快速簡單的方法來重新部署我的更改文件。

如何確定webapp真正需要哪些軟件包,因爲spring和apache-cxf帶有很多庫文件,我相信我不需要所有軟件包。

回答

5

當部署.war,第一件事Tomcat的確實是該文件解壓縮到其webapps目錄,子目錄中的具有相同的名稱作爲您.war

在開發過程中,您顯然可以訪問您的.class文件,.jar文件,配置文件以及任何最終進入您的.war的內容。您可以輕鬆地建立受您的更改影響的一小部分文件。如圖所示,然後使用腳本或ant任務或其他任何方法將這些小部分文件直接複製到服務器上的webapps/yourapp目錄中。

要看到您的更改生效,您需要重新啓動您的應用程序。如果Tomcat處於開發模式,則強制重新加載(當然重新啓動)的一種簡單方法是更新WEB-INF/web.xml。因此,您的部署過程touch該文件或以其他方式更新它的方式會給它一個新的時間戳,scp(最好是更新的最後一個文件),並且您應該快速輕鬆地重新加載。

0

我不認爲有更快的方式來重新部署WAR文件的更改。

如果以分解方式進行部署,您可以看到文件時間戳已更改並採取相應措施,但您必須編寫代碼才能執行此操作。

我不知道OSGi是否可以在這裏幫忙。這將允許你將你的問題分成更獨立和可交換的模塊。

只是好奇:

  1. 多久吃什麼好呢?
  2. 您是否使用持續集成來構建和部署?
+0

最大的問題是上傳到遠程服務器的時間,它自我運行的部署快速而乾淨。我只能測試遠程服務器上的漏洞web應用程序,因爲Web應用程序構建的hudge和子系統複雜。 – Alex 2010-07-06 09:54:05

2

我所做的是從WAR中排除WEB-INF/lib/*。jar文件並在服務器端重新組合。在我的情況下,這可以將60MB的WAR降低到250k,這可以實現真正的快速部署。

<exclude name="**/lib/*.jar"/>命令是什麼不包括JAR的(見ANT構建最後的代碼片段)

在服務器端,它很容易從修剪WAR組裝完全填充WAR:

  1. 解壓/分解由以下ANT腳本創建的修剪過的WAR:
  2. 將服務器存儲庫jar文件複製到分解的WEB-INF/lib中
  3. zip全部上傳到新的(大)WAR中。
  4. 照常部署。

例如:

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>   

1

我用rsync.war從我的本地機器複製到生產。它通常提供大約8-10倍的加速。

另一種選擇是使用git來存儲.war文件。當你git push一個新的.war,只有差異轉移。也是一個很大的加速。有人說git並不是爲存儲大文件而設計的,它變得緩慢並且效果不佳。實際上,回購會增長很多,但在某些情況下,這可能是一個不錯的選擇。

有些數字:我的.war約爲50MB,當我部署一個新版本時,它僅複製大約4MB而不是上傳一場完整的新戰爭。與gitrsync

更新:我碰到了它的問題是它有幾個.war版本後,因爲它將採取永遠創建所有的增量,並將其發送給客戶端的混帳回購協議無法克隆。

我改變了策略,將.war文件上傳到保管箱中。 Dropbox也使用rsync種類,只複製deltas。從服務器我忘了.war並重新部署應用程序。希望這可以幫助。

+0

'rsync'非常快!只需幾秒鐘,而不是5-7分鐘爲我的應用程序。調試在本地計算機上一樣快。非常感謝! – 2014-04-19 00:28:07