Maven学习笔记(四)——部署篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_Megamind/article/details/82284753

前提

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

猜你喜欢

转载自blog.csdn.net/Mr_Megamind/article/details/82284753
今日推荐