maven 自動部署到遠端 tomcat
使用maven的自動部署功能可以很方便的將maven工程自動部署到遠端tomcat伺服器,節省了大量時間。
本文章適用於tomcat的7.x ,8.x, 9.x版本。
下面是自動部的步驟
1,首先,配置tomcat的manager
編輯遠端tomcat伺服器下的conf/tomcat-users.xml,在末尾增加(其實只要拉到檔案末尾,去掉註釋改一下就可以了)
<role rolename="manager-gui"/> <role rolename="manager-script"/> <user username="admin" password="password" roles="manager-script"/> <user username="root" password="password" roles="manager-gui"/>
將上面的password改為自己的密碼,注意對於tomcat9來說,不能同時賦予使用者manager-script和manager-gui角色。
儲存tomcat-users.xml。
在tomcat伺服器的conf/Catalina/localhost/目錄下建立一個manager.xml檔案,寫入如下值:
<?xml version="1.0" encoding="UTF-8"?> <Context privileged="true" antiResourceLocking="false" docBase="${catalina.home}/webapps/manager"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" /> </Context>
儲存退出。
然後在瀏覽器中輸入http://serverip:port/manager/html,此時會彈出要求輸入使用者名稱和密碼對話方塊,輸入manager-gui對應的使用者和密碼登入管理控制檯(其中serverip為伺服器ip,如果伺服器在本地就是localhost或者127.0.0.1,埠為tomcat埠,預設8080)。以此確認manager是否配置正確。正確結果示例如下:
2,在maven專案中新增配置
在pom.xml檔案中,在plugins節點下新增如下plugin節點
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <url>http://serverip:port/manager/text</url> <username>admin</username> <password>password</password> <update>true</update> <path>/webapp</path> </configuration> </plugin>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
</dependency>
將上面的serverip和port換成自己tomcat伺服器的ip和埠。密碼換成上面配置的manager-script角色的密碼。path改為專案在tomcat伺服器中的部署路徑。
然後進行部署,如果是第一次部署,執行mvn tomcat7:deploy進行自動部署(對於tomcat8,9,也是使用tomcat7命令),如果是更新了程式碼後重新部署更新,執行mvn tomcat7:redeploy,如果第一次部署使用mvn tomcat7:redeploy,則只會執行上傳war檔案,伺服器不會自動解壓部署。如果路徑在tomcat伺服器中已存在並且使用mvn tomcat7:deploy命令的話,上面的配置中一定要配置<update>true</update>,不然會報錯。
如果IDE是eclipse,就在runas->run configurations中配置一個maven build,intellij類似。
3. 記憶體洩漏
使用上面的方法進行部署後會出現嚴重的記憶體洩漏現象。tomcat的manager提供了診斷在部署時是否產生記憶體洩漏的功能,在上面提到的http://serverip:port/manager/html這個頁面底部有一個“Find leaks”的按鈕,如下:
擊按鈕,網頁頭部出現如下資訊說明在部署的時候有記憶體洩漏:
上面的訊息顯示部署的test專案存在記憶體洩漏,如果同一專案多次重新部署,則一個專案名可能會出現多次。
部署時產生記憶體洩漏的原因是每次(重新)部署時,Tomcat會為專案新建一個類載入器,而舊的類載入器沒有被GC回收。maven的庫classloader-leak-prevention-servlet可以用來解決這個問題。具體方案為:
(1)新增maven依賴:
<dependency>
<groupId>se.jiderhamn.classloader-leak-prevention</groupId>
<artifactId>classloader-leak-prevention-servlet</artifactId>
<version>2.1.0</version>
</dependency>
(2)在專案的web.xml中新增一個Listener(必須讓此Listener成為web.xml中的第一個Listener,否則不起作用)
<listener>
<listener-class>se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventorListener</listener-class>
</listener>
這樣部署時的記憶體洩漏就解決了。
注意:
1) 新增這個Listener後,預設在tomcat關閉5s後jvm會進行記憶體回收的操作,具體時間設定可在下面的第三個參考連結中找到,所以,在關閉後的5s內,再次啟動tomcat,可能會存在問題,導致啟動無效(如果出現tomcat重啟後日志顯示正常但是伺服器不工作的話考慮一下是不是這個問題)。
2)這個Listener只解決部署的記憶體洩漏,其他問題(如jdbc等)產生的記憶體洩漏還需要自己解決。