使用tomcat7插件將項目一鍵部署到遠程tomcat服務器-熱部署

版權聲明:本文來自 Crocutax 的博客 , 轉載請注明出處 http://www.crocutax.com

現在用maven管理J2EE項目應該是常態了,在開發階段我們經常需要經歷反復的"修改代碼->部署->測試"過程。如果每次修改完代碼,都通過maven先clean->package,再手動到輸出目錄把打好的war包copy到tomcat的webapps下,多次的重復這種無意義的體力活會讓人煩躁,而且顯得沒有程序員精神。

不得不說,有些時候“懶”還是有很多正面意義的。這篇文章就是介紹下如何通過tomcat7插件將項目一鍵部署到tomcat服務器的webapps目錄下。命令很簡單,主要是環境配置,以及踩坑記錄。

實現tomcat熱部署用到了:

  • maven (項目構建和依賴管理)
  • tomcat7插件 (部署到tomcat的插件)
  • tomcat服務器 (web服務器)

1.添加tomcat用戶及權限

由于涉及到tomcat的自動部署,所以需要具備tomcat的管理權限,而普通的tomcat用戶是沒有管理權限的,比如通過{TOMCAT_HOME}/bin/startup.bat啟動tomcat之后,在首頁右側的Manager App中,需要先輸入管理員賬戶和密碼才能進行項目服務器上項目的管理,否則根本無法進入管理頁面。

添加用戶和權限也很簡單,在{TOMCAT_HOME}/conf/tomcat-users.xml 文件中,</tomcat-users>節點下添加如下內容,創建管理角色和用戶,并授權用戶管理角色:

<role rolename="manager-gui" />
<role rolename="manager-script" />
<user username="tomcat" password="tomcat" roles="manager-gui, manager-script"/>

之后進入tomcat首頁->Manager App測試管理員賬號是否創建成功

注:

  • username和password可以自定義,這里為了簡單記憶使用了tomcat同時作為用戶名和密碼。
  • 網上有的博客這里配置了大量的權限,但是目前并沒有發現其在這個階段的作用和意義。

2.配置tomcat允許遠程訪問

默認tomcat只允許本地部署,如果是要部署到遠程服務器上,那么需要在遠程服務器的{TOMCAT_HOME}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>

如果只想允許部分IP擁有訪問權限,那么可以配置allow節點,比如

allow="127.0.0.1,192.168.1.*"

代表只允許主機擁有訪問權限。

注意:

如果沒有這一步的配置,本地tomcat服務器部署正常,但是遠程tomcat服務器會報出下方常見問題中提到的Cannot invoke Tomcat manager: Connection reset by peer: socket write error異常

3.為maven添加tomcat管理員賬號

由于需要使用maven來構建和部署項目,所以maven就需要擁有tomcat的管理員賬號信息。
{MAVEN_HOME}/conf/settings.xml文件中<servers>節點下添加如下內容:

<!-- 配置可以操作tomcat的用戶名和密碼 -->
<server>
    <id>crocutax</id>
    <!-- server login name -->
    <username>tomcat</username>
    <!-- server login password -->
    <password>tomcat</password>
</server>

4.配置tomcat7插件

在項目的pom.xml中配置tomcat7 plugin,具體節點的意義看注釋或下方清單

<!-- 配置Tomcat插件 -->
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>

    <configuration>
        <!-- 此處的名字必須和{MAVEN_HOME}/conf/settings.xml中配置的server節點的id一致-->
        <server>crocutax</server>
        <!--服務器端口號-->
        <port>8080</port>
        <!-- 項目發布的路徑,默認就是tomcat/webapps目錄,可以指定深層次目錄,留"/",則默認在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>-->
        <!--解決中文參數亂碼問題-->
        <uriEncoding>UTF-8</uriEncoding>
        <update>true</update>
        <!--配置在tomcat\conf\tomcat-users.xml中定義的用戶名-->
        <username>tomcat</username>
        <password>tomcat</password>
    </configuration>
</plugin>

節點清單

  • server : 名字必須和{MAVEN_HOME}/conf/settings.xml中配置的server節點的id一致
  • port : 服務器端口號
  • path :項目發布的路徑,默認就是tomcat/webapps目錄,可以指定深層次目錄,留"/",則默認在webapps目錄下部署ROOT.war包
  • url : 注意tomcat7此處的url,不能隨意修改,后綴必須是text,不能是html. 如果是本地tomcat部署,用localhost和ip都可以
  • uriEncoding :解決中文參數亂碼問題
  • update : 熱部署,否則后期會報錯
  • username :配置{TOMCAT_HOME}\conf\tomcat-users.xml中定義的用戶名
  • password :同上

5.啟動tomcat服務器

先通過{TOMCAT_HOME}/bin/startup.bat啟動tomcat,啟動完畢之后再進行部署,否則會報出如下異常

Cannot invoke Tomcat manager: Connection refused: connect -> [H
elp 1]

6.maven命令部署

在IDE->Terminal 或 項目根目錄打開dos窗口,輸入maven命令

  • mvn clean package tomcat:deploy (使用的是插件1.1版本,如果pom.xml中配置的是2.2版本,那么使用這么命令會報錯)
  • mvn clean package tomcat7:deploy (使用的是插件2.2版本,自己用的這個)

然后看著命令行歇一會吧

...
[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] ------------------------------------------------------------------------

出現 BUILD SUCCESS,就部署成功了!

常見的部署命令,在Tomcat7 Plugin Documentation 中有詳細介紹,這里羅列幾個常用的:

  • tomcat7:run 運行當前項目
  • tomcat7:deploy 部署當前項目
  • tomcat7:redeploy 重新部署項目
  • tomcat7:undeploy 取消部署當前項目

常見問題

Tomcat return http status error: 401, Reason Phrase: Unauthorized

未授權訪問tomcat,即沒有tomcat的管理權限,如果沒有進行步驟1中的"添加tomcat用戶及權限"操作,遠程部署時就會報此異常。

還有一種情況,已經在conf/tomcat-users.xml中配置了用戶和權限

<!-- 創建用戶,并授權 -->
<role rolename="manager-gui" />
<role rolename="manager-script" />
<user username="tomcat" password="tomcat" roles="manager-gui, manager-script"/>

但是還是有這個異常信息,于是在服務器tomcat首頁測試Manager App,發現定義的tomcat管理員角色無法正常登陸。這說明配置的用戶和角色出問題了,繼續排查,在tomcat啟動日志中,發現了如下異常信息:

警告: Unexpected exception resolving reference
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字節的 UTF-8 序列的字節 1 無效。

于是懷疑是有中文字符造成的影響,刪掉了在tomcat-users.xml中的中文注釋,即

<!-- 創建用戶,并授權 -->

再次部署,tomcat Manager App 測試成功,遠程一鍵部署成功!

注:

雖然這里是WARN而不是ERROR,但是還是有可能造成一些內部程序的加載失敗導致功能缺失,比如這里的tomcat啟動成功,但是內部管理權限卻配置失敗,進而導致遠程部署因沒有權限而失敗。所以,從嚴謹性角度出發,如果精力足夠,那么所有的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]

這個應該是部署的時候最容易出現的異常了,在這里卡了很久。網上查了一大圈。根本原因是:當客戶端發出請求(request)后,如果還沒有完全獲得服務端的響應(response),客戶端與服務器段的連接斷開(例如斷網、按了“停止”按鈕、或者客戶端瀏覽器關閉等),服務器端就會拋出此Exception。

這個問題需要從多方面排查。

1.如果是遠程服務器,需要配置tomcat允許遠程訪問,見步驟2

2.有的說tomcat9在步驟1中配置用戶權限時,同一個用戶不能同時擁有manager-guimanager-script權限,但是我分開了之后,依然沒有解決這個問題。最終放棄使用tomcat9,使用tomcat7,一切正常了。

3.如果tomcat上已經部署了該項目,那么需要使用redeploy命令,即mvn tomcat7:redeploy

部署后的項目404

以下3種原因都有可能造成部署后的項目無法正常訪問,報404:

  1. 如果是遠程服務器,請確保8080端口已經添加到入網規則中
  2. pom.xml中tomcat7插件的path節點配置的有問題
  3. 項目本身404

tomcat內存泄漏

tomcat日志中報出

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

等有時間了再研究,http://www.cnblogs.com/xyb930826/p/5725340.html 中有提到

參考鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容