IDEA開發工具maven項目經過tomcat7插件遠程部署項目

1.添加tomcat用戶及權限

因爲涉及到tomcat的自動部署,因此須要具有tomcat的管理權限,而普通的tomcat用戶是沒有管理權限的,好比經過{TOMCAT_HOME}/bin/startup.bat啓動tomcat以後,在首頁右側的Manager App中,須要先輸入管理員帳戶和密碼才能進行項目服務器上項目的管理,不然根本沒法進入管理頁面。php

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

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

以後進入tomcat首頁->Manager App測試管理員帳號是否建立成功html

注:java

  • username和password能夠自定義,這裏爲了簡單記憶使用了tomcat同時做爲用戶名和密碼。
  • 網上有的博客這裏配置了大量的權限,可是目前並無發現其在這個階段的做用和意義。

2.配置tomcat容許遠程訪問

默認tomcat只容許本地部署,若是是要部署到遠程服務器上,那麼須要在遠程服務器的{TOMCAT_HOME}conf/Catalina/localhost/目錄下建立一個manager.xml文件,配置以下內容:web

<?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節點,好比apache

allow="127.0.0.1,192.168.1.*" 

表明只容許主機擁有訪問權限。瀏覽器

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

3.爲maven添加tomcat管理員帳號

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

<!-- 配置能夠操做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

非原創,文章來源及參考以下 做者:王西文 連接:https://www.jianshu.com/p/d4585b83b9dd
相關文章
相關標籤/搜索