Maven學習筆記(四)——部署篇

前提

這篇博文是這套Maven學習筆記的第四篇——部署篇,主要內容爲通過Cargo插件自動部署WAR包到服務器上。如果需要了解有關Maven的綜述信息或博文的索引信息,請移步:
《綜述篇》


需要解決的問題

一般情況下,當我們對自己的Web App進行了更新之後,需要將工程重新打包並部署到本地或服務器上。這項工作需要以下幾個步驟:

①打包工程,生成WAR包;
②複製WAR包到Tomcat服務器的webapps文件夾下;
③重啓Tomcat服務器。

如果需要頻繁的更新部署(如測試階段),那麼這項工作無疑是耗時且消耗我們耐性的。通過Maven,我們希望它能自動化的完成這項工作,省去我們的簡單重複勞動。


開發環境中的基礎配置

①首先,在Netbeans裏打開工程中的settings.xml,它實際指向的是公共的C:/Users/XXX/.m2/settings.xml文件。這是Maven的全局配置文件。
settings.xml

②因爲我們要用到的Cargo插件不在Maven的中央倉庫中,因此需要在<pluginGroups>標籤中添加以下配置信息:

        <pluginGroup>org.codehaus.cargo</pluginGroup>

③爲了不在代碼中暴露服務器的IP地址、賬戶和密碼,需要將這些信息定義在本地配置中,找到<profiles>標籤,在其中添加以下配置信息:

        <profile>
            <id>myServer</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <server.uri>http://IP_OF_YOUR_SERVER/manager/text</server.uri>
                <server.username>USERNAME</server.username>
                <server.password>PASSWORD</server.password>
            </properties>
        </profile>

解釋:
①id處可以隨意設置,後面不會用到;
②將IP_OF_YOUR_SERVER換成你的服務器的IP地址;
③將USERNAME換成自定義的用戶名;
④將PASSWORD換成自定義的密碼。
其中需要特別注意的是,用戶名和密碼在後面還會用到,一定要保證前後一致,不然會無法連接服務器。


部署

通過Maven的Cargo插件,可以將WAR包部署到本地遠程服務器上。

本地部署

本地部署分爲兩種類型:standalone模式和existing模式。其中,前者會將服務器上下文環境拷貝一份到用戶指定的文件夾下,然後在這個獨立的環境部署WAR包;而後者會直接在tomcat的webapps文件夾下部署WAR包。
因爲之前使用standalone模式部署的時候發生過上下文環境不完整的錯誤,因此這裏只說existing模式。

①將下面的配置信息添加入pom.xml<plugins>標籤中:

            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <version>1.6.9</version>
                <configuration>
                    <container>
                        <containerId>tomcat7x</containerId>
                        <home>${server.home}</home>
                    </container>
                    <configuration>
                        <type>existing</type>
                        <home>${server.home}</home>
                        <properties>
                            <cargo.servlet.port>80</cargo.servlet.port>
                        </properties>
                    </configuration>
                </configuration>
            </plugin>

解釋:
<home>標籤裏填tomcat的絕對路徑;
<cargo.servlet.port>標籤裏填任意一個本地tomcat開放了的端口好就可以了。

②部署之前必須先打包,打包完成後,通過配置好的Run Cargo菜單項就可以自動部署WAR包到本地了。
關於打包的方法,請移步《中央倉庫與依賴管理篇》最後一步小節;
關於設置Maven命令快捷菜單項的方法,請移步《配置篇》

遠程部署

①遠程部署之前,需要先爲遠端Tomcat服務器配置用戶,打開conf/tomcat-users.xml文件,在<tomcat-users>標籤中添加以下配置信息:

  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>  
  <role rolename="manager-status"/>
  <role rolename="admin-gui"/>
  <user username="USERNAME" password="PASSWORD" roles="admin-gui,manager-gui,manager-script,manager-status"/>

注意:這裏的USERNAMEPASSWORD和上文中必須保持一致。

②在pom.xml<plugins>標籤中添加以下的配置信息:

            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <version>1.6.9</version>
                <configuration>
                    <container>
                        <containerId>tomcat7x</containerId>
                        <type>remote</type>
                    </container>
                    <configuration>
                        <type>runtime</type>
                        <!-- 以下服務器配置信息在本地settings.xml中 -->
                        <properties>
                            <cargo.remote.uri>${server.uri}</cargo.remote.uri>
                            <cargo.remote.username>${server.username}</cargo.remote.username>
                            <cargo.remote.password>${server.password}</cargo.remote.password>
                        </properties>
                    </configuration>
                    <deployables>
                        <deployable>          
                            <groupId>${project.groupId}</groupId>  
                            <artifactId>${project.artifactId}</artifactId>  
                            <type>war</type>  
                            <properties>  
                                <context>/${project.artifactId}</context>
                            </properties>  
                        </deployable>
                    </deployables>
                </configuration>
                <executions>
                    <execution>
                        <id>verify-deployer</id>
                        <phase>install</phase>
                        <goals>
                            <goal>deployer-redeploy</goal>
                        </goals>
                    </execution>
                </executions>  
            </plugin>
        </plugins>

解釋:這段配置不需要任何修改,直接可用。因爲我們在settings.xml中配置了服務器的urlusernamepassword,因此,以下這三行會自動讀取配置:
<cargo.remote.uri>${server.uri}</cargo.remote.uri>
<cargo.remote.username>${server.username}</cargo.remote.username>
<cargo.remote.password>${server.password}</cargo.remote.password>
這樣既可以做到不在代碼中暴露服務器的敏感信息,又可以使這段配置信息變成通用的。

③需要部署時,使用和本地部署類似的方法,配置一個cargo:redeploy命令的菜單項,即可一鍵完成部署。


兩個額外的點

①因爲我的示例工程是一個不具有任何頁面的特殊Web App,因此無法從外部訪問。正常的可訪問的Web App可以在部署完成後讓Cargo自動地嘗試訪問。 所需要的額外步驟是:在<deployable>標籤中加上以下幾行配置信息:

<!-- 可選:驗證是否部署成功 -->                
<pingURL>http://IP_OF_YOUR_SERVER/${project.artifactId}</pingURL>               
<!-- 可選:驗證超時時間,默認是120000 毫秒-->			
<pingTimeout>60000</pingTimeout>

其中,IP_OF_YOUR_SERVER和上文中一樣,是你的服務器的IP。

②有的時候,我們想讓WAR包在部署的時候直接更名爲ROOT,這樣部署之後就可以不需要輸入工程名直接訪問了。需要額外添加以下兩個步驟:
  1)在pom.xml文件的<build>標籤中加入以下配置信息:

<finalName>ROOT</finalName>

  2)將META-INF文件夾下context.xml文件中<Context>標籤的path屬性改爲空字符串""。說着比較繞,修改之後context.xml文件的內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path=""/>

後記

加上部署的部分,使用Maven來管理工程的整個生命週期的內容就基本完整了。但除此之外,還有測試的內容未包含其中。在後面學習和掌握之後,我會添上這部分的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章