前提
这篇博文是这套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来管理工程的整个生命周期的内容就基本完整了。但除此之外,还有测试的内容未包含其中。在后面学习和掌握之后,我会添上这部分的内容。