開發過程使用Tomcat Maven插件持續快捷部署Web項目

    我在平時工做中部署Web項目到測試服務器上的Tomcat時用的是Hudson。Hudson自己已經跟SVN、Git、Maven集成而且支持添加各類插件。但若是使用Hudson,我須要配置兩個任務:一個任務負責打包項目成WAR,另一個任務負責部署打包好的WAR包到目標服務器的Tomcat上。雖然任務只須要配置一次,但每次修改代碼提交後,都得切換到瀏覽器點Hudson構建任務頁面上的Build Now按鈕,而後還得跳轉到另外一個頁面觀察是否有報錯,而後再點擊執行相應的部署任務。煩不勝煩,偶然發現Tomcat Maven插件支持直接打包並部署項目到Tomcat中,嘗試一番後終於搞定,總結於此。html

    網上關於這個主題的文章也很多,過程也大同小異,但本文除了過程外還想記錄下我期間踩過的坑和關於這種部署方案的建議。java


一、準備工做web

    下載安裝並配置好Tomcat和Maven。spring

    準備好一個Maven Web項目。shell


二、Maven部署Web項目到Tomcat的配置apache

2.一、配置Tomcat角色api

    Maven自動部署實際上調的是Tomcat安裝目錄下的manager功能。而爲了能正常訪問http://localhost:8080/manager頁面,咱們須要修改$TOMCAT_HOME/conf目錄下的tomcat-users.xml:瀏覽器

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

2.二、修改pom.xml增長Tomcat Maven插件tomcat

   我使用的Tomcat7,pom.xml中增長以下配置:
服務器

    <properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<spring.version>3.2.2.RELEASE</spring.version>
		<finalName>web-loab</finalName>
	</properties>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<configuration>
					<url>http://localhost:8080/manager/text</url>
					<server>tomcat</server>
					<username>tomcat</username>
					<password>tomcat</password>
					<path>/${finalName}</path>
				</configuration>
			</plugin>
		</plugins>
	</build>

   上面username、password來自tomcat-users.xml。server是Tomcat服務器名稱。path是訪問應用的路徑。url指定Tomcat管理頁路徑。

2.三、修改Maven的settings.xml

   在$USER_HOME/.m2目錄下找到settings.xml,添加server節點:

<servers>
    <server>
       <id>tomcat</id>
       <username>tomcat</username>
       <password>tomcat</password>
    </server>
</servers>

    上面的username、password依然與tomcat-users.xml中相同,id與2.2中的server相同

2.四、部署項目到Tomcat

    先確保Tomcat服務器已經啓動,而後cd到項目根目錄,運行下面的命令:

mvn clean tomcat7:redeploy

    部署成功,以下:

    而後咱們就能在Tomcat安裝目錄的webapps目錄下找到新部署的WAR包。

    初次部署用的是tomcat7:deploy命令,從新部署能夠用tomcat7:redeploy命令(推薦統一用這個),Tomcat Maven插件支持的命令包括:run、shutdown、run-war-only、exec-war、standalone-war-only、deploy、standalone-war、undeploy、run-war、redeploy等。


三、踩過的坑

    光看上面的過程,彷佛很是順暢,但世上的事老是不會那麼順利的。下面列舉幾個我踩過的坑。

3.一、Windows系統下,redeploy過程沒法刪除舊項目的目錄

    報錯信息在$TOMCAT_HOME/logs下的catalina日誌文件中,以下:

信息: Undeploying context [/web-loab]
十月 11, 2014 3:52:26 下午 org.apache.catalina.startup.ExpandWar deleteDir
嚴重: [D:\tomcat\apache-tomcat-7.0.56\webapps\web-loab\WEB-INF] could not be completely deleted. The presence of the remaining files may cause problems

    大概是由於Tomcat還在使用這個目錄,沒法刪除,必須修改$TOMCAT_HOME/conf/context.xml:

<Context antiJARLocking="true" antiResourceLocking="true">

3.二、Servelt.class offending

    這個問題應該不屬於本文主題範疇了,但可能由於這個致使Web項目啓動起來卻沒法訪問,報錯信息以下:

十月 11, 2014 3:46:29 下午 org.apache.catalina.loader.WebappClassLoader validateJarFile
信息: validateJarFile(D:\tomcat\apache-tomcat-7.0.56\webapps\web-loab\WEB-INF\lib\servlet-api-6.0.29.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/servlet/Servlet.class

    緣由是webapps目錄下的某個Web項目的WEB-INF/lib目錄下有servlet-api.jar,刪除之,並在pom.xml中指定servelt-api.jar的scope爲provided:

<dependency>
	<groupId>org.apache.tomcat</groupId>
	<artifactId>servlet-api</artifactId>
	<version>6.0.29</version>
	<scope>provided</scope>
</dependency>

3.三、版本問題

    確保Web項目的Java Build Path使用的JDK版本、Java Compiler的編譯JDK版本以及Project Facets裏的Java版本一致。

    若是用的Tomcat6,則pom.xml中配置tomcat6-maven-plugin,若是用的tomcat7則用tomcat7-maven-plugin。或者默認用tomcat-maven-plugin。


四、有關使用Tomcat Maven插件部署項目的一些建議

    這種方案可以實現持續快捷部署。但它有一些侷限性:

  • 要求從本地開發環境能直接訪問Tomcat服務器所在網段

  • 不能保留歷史部署包

    所以初步建議只在開發環境使用這種部署方式,而且結合SVN、Git等版本控制軟件作兩個內部約定:

  • 全部可部署版本代碼都必須先簽入一個名爲deploy-xx的分支,xx表示當前可部署版本,deploy分支代碼必須保證是能夠部署的代碼,而後切到deploy-xx分支再部署項目

  • 之後增長了新功能,則需新建另外一個deploy分支,並增大版本號。這樣能夠利用版本控制軟件幫咱們保留各個歷史可部署代碼(解決了上面提到的第二個侷限性)。尤爲是多個項目集成時,最好保證每一次集成時各個項目的deploy分支帶的版本後綴相同。這樣能夠方便各個項目代碼集體回滾 

完!轉載請註明出處:http://my.oschina.net/feichexia/blog/326893

相關文章
相關標籤/搜索