前提
這篇博文是這套Maven學習筆記的第四篇——部署篇,主要內容爲通過Cargo插件自動部署WAR包到服務器上。如果需要了解有關Maven的綜述信息或博文的索引信息,請移步:
《綜述篇》
需要解決的問題
一般情況下,當我們對自己的Web App進行了更新之後,需要將工程重新打包並部署到本地或服務器上。這項工作需要以下幾個步驟:
①打包工程,生成WAR包;
②複製WAR包到Tomcat服務器的webapps文件夾下;
③重啓Tomcat服務器。
如果需要頻繁的更新部署(如測試階段),那麼這項工作無疑是耗時且消耗我們耐性的。通過Maven,我們希望它能自動化的完成這項工作,省去我們的簡單重複勞動。
開發環境中的基礎配置
①首先,在Netbeans裏打開工程中的settings.xml,它實際指向的是公共的C:/Users/XXX/.m2/settings.xml
文件。這是Maven的全局配置文件。
②因爲我們要用到的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"/>
注意:這裏的
USERNAME
和PASSWORD
和上文中必須保持一致。
②在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
中配置了服務器的url
、username
和password
,因此,以下這三行會自動讀取配置:
<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來管理工程的整個生命週期的內容就基本完整了。但除此之外,還有測試的內容未包含其中。在後面學習和掌握之後,我會添上這部分的內容。