版權(quán)聲明:本文來自 Crocutax 的博客 , 轉(zhuǎn)載請(qǐng)注明出處 http://www.crocutax.com
現(xiàn)在用maven管理J2EE項(xiàng)目應(yīng)該是常態(tài)了挟炬,在開發(fā)階段我們經(jīng)常需要經(jīng)歷反復(fù)的"修改代碼->部署->測(cè)試"過程漠秋。如果每次修改完代碼巫玻,都通過maven先clean->package忍些,再手動(dòng)到輸出目錄把打好的war包c(diǎn)opy到tomcat的webapps下蒋情,多次的重復(fù)這種無意義的體力活會(huì)讓人煩躁,而且顯得沒有程序員精神狭归。
不得不說枫夺,有些時(shí)候“懶”還是有很多正面意義的。這篇文章就是介紹下如何通過tomcat7插件將項(xiàng)目一鍵部署到tomcat服務(wù)器的webapps目錄下雏婶。命令很簡單物赶,主要是環(huán)境配置,以及踩坑記錄留晚。
實(shí)現(xiàn)tomcat熱部署用到了:
- maven (項(xiàng)目構(gòu)建和依賴管理)
- tomcat7插件 (部署到tomcat的插件)
- tomcat服務(wù)器 (web服務(wù)器)
1.添加tomcat用戶及權(quán)限
由于涉及到tomcat的自動(dòng)部署酵紫,所以需要具備tomcat的管理權(quán)限,而普通的tomcat用戶是沒有管理權(quán)限的,比如通過{TOMCAT_HOME}/bin/startup.bat
啟動(dòng)tomcat之后错维,在首頁右側(cè)的Manager App中奖地,需要先輸入管理員賬戶和密碼才能進(jìn)行項(xiàng)目服務(wù)器上項(xiàng)目的管理,否則根本無法進(jìn)入管理頁面需五。
添加用戶和權(quán)限也很簡單鹉动,在{TOMCAT_HOME}/conf/tomcat-users.xml
文件中轧坎,</tomcat-users>
節(jié)點(diǎn)下添加如下內(nèi)容,創(chuàng)建管理角色和用戶,并授權(quán)用戶管理角色:
<role rolename="manager-gui" />
<role rolename="manager-script" />
<user username="tomcat" password="tomcat" roles="manager-gui, manager-script"/>
之后進(jìn)入tomcat首頁->Manager App測(cè)試管理員賬號(hào)是否創(chuàng)建成功
注:
- username和password可以自定義宏邮,這里為了簡單記憶使用了tomcat同時(shí)作為用戶名和密碼。
- 網(wǎng)上有的博客這里配置了大量的權(quán)限缸血,但是目前并沒有發(fā)現(xiàn)其在這個(gè)階段的作用和意義蜜氨。
2.配置tomcat允許遠(yuǎn)程訪問
默認(rèn)tomcat只允許本地部署,如果是要部署到遠(yuǎn)程服務(wù)器上捎泻,那么需要在遠(yuǎn)程服務(wù)器的{TOMCAT_HOME}conf/Catalina/localhost/
目錄下創(chuàng)建一個(gè)manager.xml
文件飒炎,配置如下內(nèi)容:
<?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>
如果只想允許部分IP擁有訪問權(quán)限,那么可以配置allow
節(jié)點(diǎn)笆豁,比如
allow="127.0.0.1,192.168.1.*"
代表只允許主機(jī)擁有訪問權(quán)限郎汪。
注意:
如果沒有這一步的配置,本地tomcat服務(wù)器部署正常闯狱,但是遠(yuǎn)程tomcat服務(wù)器會(huì)報(bào)出下方常見問題中提到的Cannot invoke Tomcat manager: Connection reset by peer: socket write error
異常
3.為maven添加tomcat管理員賬號(hào)
由于需要使用maven來構(gòu)建和部署項(xiàng)目煞赢,所以maven就需要擁有tomcat的管理員賬號(hào)信息。
在{MAVEN_HOME}/conf/settings.xml
文件中<servers>
節(jié)點(diǎn)下添加如下內(nèi)容:
<!-- 配置可以操作tomcat的用戶名和密碼 -->
<server>
<id>crocutax</id>
<!-- server login name -->
<username>tomcat</username>
<!-- server login password -->
<password>tomcat</password>
</server>
4.配置tomcat7插件
在項(xiàng)目的pom.xml中配置tomcat7 plugin哄孤,具體節(jié)點(diǎn)的意義看注釋或下方清單
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 此處的名字必須和{MAVEN_HOME}/conf/settings.xml中配置的server節(jié)點(diǎn)的id一致-->
<server>crocutax</server>
<!--服務(wù)器端口號(hào)-->
<port>8080</port>
<!-- 項(xiàng)目發(fā)布的路徑,默認(rèn)就是tomcat/webapps目錄,可以指定深層次目錄,留"/",則默認(rèn)在webapps目錄下部署ROOT.war包-->
<path></path>
<!-- 注意tomcat7此處的url照筑,不能隨意修改,后綴必須是text,不能是html. 如果是本地tomcat部署,用localhost和ip都可以 -->
<url>http://localhost:8080/manager/text</url>
<!--<url>http://117.62.110.110:8080/manager/text</url>-->
<!--解決中文參數(shù)亂碼問題-->
<uriEncoding>UTF-8</uriEncoding>
<update>true</update>
<!--配置在tomcat\conf\tomcat-users.xml中定義的用戶名-->
<username>tomcat</username>
<password>tomcat</password>
</configuration>
</plugin>
節(jié)點(diǎn)清單
-
server : 名字必須和
{MAVEN_HOME}/conf/settings.xml
中配置的server節(jié)點(diǎn)的id一致 - port : 服務(wù)器端口號(hào)
- path :項(xiàng)目發(fā)布的路徑,默認(rèn)就是tomcat/webapps目錄,可以指定深層次目錄,留"/",則默認(rèn)在webapps目錄下部署ROOT.war包
- url : 注意tomcat7此處的url,不能隨意修改,后綴必須是text,不能是html. 如果是本地tomcat部署,用localhost和ip都可以
- uriEncoding :解決中文參數(shù)亂碼問題
- update : 熱部署,否則后期會(huì)報(bào)錯(cuò)
-
username :配置
{TOMCAT_HOME}\conf\tomcat-users.xml
中定義的用戶名 - password :同上
5.啟動(dòng)tomcat服務(wù)器
先通過{TOMCAT_HOME}/bin/startup.bat
啟動(dòng)tomcat凝危,啟動(dòng)完畢之后再進(jìn)行部署波俄,否則會(huì)報(bào)出如下異常
Cannot invoke Tomcat manager: Connection refused: connect -> [H
elp 1]
6.maven命令部署
在IDE->Terminal 或 項(xiàng)目根目錄打開dos窗口,輸入maven命令
- mvn clean package tomcat:deploy (使用的是插件1.1版本蛾默,如果pom.xml中配置的是2.2版本懦铺,那么使用這么命令會(huì)報(bào)錯(cuò))
- mvn clean package tomcat7:deploy (使用的是插件2.2版本,自己用的這個(gè))
然后看著命令行歇一會(huì)吧
...
[INFO] --- maven-war-plugin:2.2:war (default-war) @ cmw ---
[INFO] Packaging webapp
[INFO] Assembling webapp [cmw] in [D:\code\server\chinesemedicine\target\cmw]
[INFO] Processing war project
[INFO] Copying webapp resources [D:\code\server\chinesemedicine\src\main\webapp]
[INFO] Webapp assembled in [887 msecs]
[INFO] Building war: D:\code\server\chinesemedicine\target\cmw.war
[INFO] WEB-INF\web.xml already added, skipping
[INFO]
[INFO] <<< tomcat7-maven-plugin:2.2:deploy (default-cli) < package @ cmw <<<
[INFO]
[INFO]
[INFO] --- tomcat7-maven-plugin:2.2:deploy (default-cli) @ cmw ---
[INFO] Deploying war to http://localhost:8080/cmw
Uploading: http://localhost:8080/manager/text/deploy?path=%2Fcmw&update=true
Uploaded: http://localhost:8080/manager/text/deploy?path=%2Fcmw&update=true (45960 KB at 40564.5 KB/sec)
[INFO] tomcatManager status code:200, ReasonPhrase:OK
[INFO] OK - Deployed application at context path /cmw
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 18.075 s
[INFO] Finished at: 2017-09-17T11:31:21+08:00
[INFO] Final Memory: 20M/293M
[INFO] ------------------------------------------------------------------------
出現(xiàn) BUILD SUCCESS支鸡,就部署成功了阀趴!
常見的部署命令,在Tomcat7 Plugin Documentation 中有詳細(xì)介紹苍匆,這里羅列幾個(gè)常用的:
- tomcat7:run 運(yùn)行當(dāng)前項(xiàng)目
- tomcat7:deploy 部署當(dāng)前項(xiàng)目
- tomcat7:redeploy 重新部署項(xiàng)目
- tomcat7:undeploy 取消部署當(dāng)前項(xiàng)目
常見問題
Tomcat return http status error: 401, Reason Phrase: Unauthorized
未授權(quán)訪問tomcat刘急,即沒有tomcat的管理權(quán)限,如果沒有進(jìn)行步驟1中的"添加tomcat用戶及權(quán)限"操作,遠(yuǎn)程部署時(shí)就會(huì)報(bào)此異常浸踩。
還有一種情況叔汁,已經(jīng)在conf/tomcat-users.xml
中配置了用戶和權(quán)限
<!-- 創(chuàng)建用戶,并授權(quán) -->
<role rolename="manager-gui" />
<role rolename="manager-script" />
<user username="tomcat" password="tomcat" roles="manager-gui, manager-script"/>
但是還是有這個(gè)異常信息,于是在服務(wù)器tomcat首頁測(cè)試Manager App检碗,發(fā)現(xiàn)定義的tomcat管理員角色無法正常登陸据块。這說明配置的用戶和角色出問題了,繼續(xù)排查,在tomcat啟動(dòng)日志中,發(fā)現(xiàn)了如下異常信息:
警告: Unexpected exception resolving reference
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字節(jié)的 UTF-8 序列的字節(jié) 1 無效折剃。
于是懷疑是有中文字符造成的影響另假,刪掉了在tomcat-users.xml中的中文注釋,即
<!-- 創(chuàng)建用戶,并授權(quán) -->
再次部署,tomcat Manager App 測(cè)試成功,遠(yuǎn)程一鍵部署成功!
注:
雖然這里是WARN而不是ERROR,但是還是有可能造成一些內(nèi)部程序的加載失敗導(dǎo)致功能缺失怕犁,比如這里的tomcat啟動(dòng)成功边篮,但是內(nèi)部管理權(quán)限卻配置失敗,進(jìn)而導(dǎo)致遠(yuǎn)程部署因沒有權(quán)限而失敗奏甫。所以戈轿,從嚴(yán)謹(jǐn)性角度出發(fā),如果精力足夠阵子,那么所有的WARN都不容忽視思杯。
Connection reset by peer: socket write error
異常信息:[ERROR] Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) on project cmw: Cannot invoke Tomcat manager: Connection reset by peer: socke
t write error -> [Help 1]
這個(gè)應(yīng)該是部署的時(shí)候最容易出現(xiàn)的異常了,在這里卡了很久挠进。網(wǎng)上查了一大圈色乾。根本原因是:當(dāng)客戶端發(fā)出請(qǐng)求(request)后,如果還沒有完全獲得服務(wù)端的響應(yīng)(response)领突,客戶端與服務(wù)器段的連接斷開(例如斷網(wǎng)暖璧、按了“停止”按鈕、或者客戶端瀏覽器關(guān)閉等)攘须,服務(wù)器端就會(huì)拋出此Exception漆撞。
這個(gè)問題需要從多方面排查殴泰。
1.如果是遠(yuǎn)程服務(wù)器,需要配置tomcat允許遠(yuǎn)程訪問浮驳,見步驟2
2.有的說tomcat9在步驟1中配置用戶權(quán)限時(shí)悍汛,同一個(gè)用戶不能同時(shí)擁有manager-gui
和manager-script
權(quán)限,但是我分開了之后至会,依然沒有解決這個(gè)問題离咐。最終放棄使用tomcat9,使用tomcat7奉件,一切正常了宵蛀。
3.如果tomcat上已經(jīng)部署了該項(xiàng)目,那么需要使用redeploy命令县貌,即mvn tomcat7:redeploy
部署后的項(xiàng)目404
以下3種原因都有可能造成部署后的項(xiàng)目無法正常訪問术陶,報(bào)404:
- 如果是遠(yuǎn)程服務(wù)器,請(qǐng)確保8080端口已經(jīng)添加到入網(wǎng)規(guī)則中
- pom.xml中tomcat7插件的
path
節(jié)點(diǎn)配置的有問題 - 項(xiàng)目本身404
tomcat內(nèi)存泄漏
tomcat日志中報(bào)出
The web application [/appStore] appears to have started a thread named [Thread-2],but has failed to stop it ,this is very likely to create a memory leak
等有時(shí)間了再研究煤痕,http://www.cnblogs.com/xyb930826/p/5725340.html 中有提到