《Maven实战》笔记-8-构建部署Web项目

时间:2022-02-23 01:29:46
 
一、Web项目结构
1、显式指定Web项目打包方式为war:
 
《Maven实战》笔记-8-构建部署Web项目

2、默认目录
根据“约定大于配置”的规则,Web项目的类及资源文件默认位置为src/main/java和src/main/resources,测试类和测试资源文件默认位置src/test/java和src/test/resources,Web资源目录位于src/main/webapp。
Maven项目结构没有War包中的lib目录,因为依赖都配置在POM中,Maven在用War方式打包的时候会根据POM配置从本地仓库复制相应的Jar文件。
 
3、war包名称——finalName元素配置
超级POM中设定的值为${project.artifactId}-${project.version}.war。
部署测试环境或最终产品环境,需要简洁的war包,需要配置finalName元素。
 
二、使用jetty-maven-plugin进行测试
1、原理
传统的Web测试方法要求编译、测试、打包及部署,这往往消耗很多时间,jetty-maven-plugin能够帮助我们节省时间,它能够周期性地检查项目内容,发现变更后自动更新到内置的Jetty Web容器中。即,帮我们省去了打包和部署的步骤。
2、配置
《Maven实战》笔记-8-构建部署Web项目
webappConfig元素下的contextPath表示项目部署后的上下文路径,上述配置/test表示用户可以通过http://hostname:port/test/访问该应用。
3、启动jetty-maven-plugin
默认情况下,只有org.apache.maven.plugins和org.codehaus.mojo两个gounpId下的插件才支持简化的命令行应用,即可运行mvn help:system。但mvn jetty:run就不行。
为了能够在命令行直接运行mvn jetty:run,用户需要配置settings.xml如下:
《Maven实战》笔记-8-构建部署Web项目
然后可运行:
  1. mvn jetty:run
 
或者指定端口:
  1. mvn jetty:run -Djetty.port=9999
停止测试运行,可Ctrl+C即可。
 
三、使用Cargo实现自动化部署
 
cargo-maven2-plugin和jetty-maven-plugin的功能看起来相似,但是目的不同。jetty-maven-plugin主要用来帮助日常的快速开发和测试,而cargo-maven2-plugin主要服务于自动化部署。
使用cargo,只需要一条简单的maven命令,就可以构建项目并部署到Web容器中,进行功能测试。
1、部署至本地Web容器
Cargo支持两种本地部署的方式,分别为standalone模式和existing模式。在stsndalone模式中,Cargo会从web容器的安装目录复制一份配置到用户指定的目录,然后在此基础上部署应用,每次重新构建的时候,这个目录都会被清空,所有配置被重新生成。
而在existing模式中,用户需要指定现有的web容器配置目录,然后Cargo会直接使用这些配置并将应用部署到其对应的位置。
如standalone模式的配置样例:
《Maven实战》笔记-8-构建部署Web项目
《Maven实战》笔记-8-构建部署Web项目
 
注意,与jetty一样,cargo-maven2-plugin的groupId是org.codehaus.cargo,不属于官方的两个Maven插件groupId,若使用简化的命令行则需要在settings.xml中pluginGroup元素中配置。
然后运行以下命令:
  1. mvn cargo:start
 
Cargo默认Web容器监听8080端口,也可以通过如下配置进行修改:
《Maven实战》笔记-8-构建部署Web项目
 
existing模式:
需要将上述Configuration子元素type的值为existing,而对于的home子元素表示现有的Web容器目录。运行后,可在Tomcat的webapps子目录看到被部署的Maven项目。
 
2、部署至远程Web容器
除了让Cargo直接管理本地Web容器外,还可以让Cargo部署应用至远程的正在运行的Web容器,前提是拥有该容器的相应权限。
《Maven实战》笔记-8-构建部署Web项目
《Maven实战》笔记-8-构建部署Web项目
tomcat中的用户权限可参看如下配置: 
  1. <role rolename="tomcat"/>
  2.   <role rolename="role1"/>
  3.   <role rolename="admin"/> 
  4.   <role rolename="manager-gui"/>
  5.   <role rolename="manager-script"/>
  6.   <role rolename="manager"/>  
  7.   <user username="admin" password="admin123" roles="admin,manager,manager-script,manager-gui"/>
 
然后运行命令如下:
  1. mvn cargo:redeploy
若容器已经部署了当前应用,Cargo会先将其卸载,然后重新部署。
 
注意,若要部署在远程机器,则需要注意以下几点:
1、远程机器防火墙要关闭
如红帽Linus系列使用如下命令:
  1. systemctl stop firewalld
 
2、远程机器的Tomcat要配置manager用户,且要有manager-script角色
参考上述tomcat中的用户权限配置,否则可能会有如下错误:
  1. [ERROR]Failed to execute goal org.codehaus.cargo:cargo-maven2-plugin:1.6.1:redeploy (default-cli) on project manage-admin:Executiondefault-cli of goal org.codehaus.cargo:cargo-maven2-plugin:1.6.1:redeploy faile
  2. d:Failed to redeploy [H:\workspace\QianduManage\manage-admin\target\manage-admin.war]:The username you provided is not allowed to use the text-based TomcatManager(error 403):Server returned HTTP response code
  3. :403for URL: http://localhost:8080/manager/text/list -> [Help 1]
  4. [ERROR]
  5. [ERROR]To see the full stack trace of the errors, re-run Maven with the -e switch.
  6. [ERROR]Re-run Mavenusing the -X switch to enable full debug logging.
  7. [ERROR]
  8. [ERROR]For more information about the errors and possible solutions, please read the following articles:
  9. [ERROR][Help1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
 
 
3、远程机器的Tomcat允许其他机器登录manager页面

需要在Tomcat目录的conf/Catalina/localhost/下新增文件:

manager.xml,内容如下:

  1. <Context privileged="true" antiResourceLocking="false"
    docBase="${catalina.home}/webapps/manager">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
    </Context>

 
4、plugin/configuration/configuration/properties需要配置cargo.hostname域名,否则默认localhost(无论cargo.tomcat.manager.url如何配置)
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.6.1</version>
<configuration>
<container>
<containerId>tomcat8x</containerId>
<type>remote</type>
</container>
<configuration>
<type>runtime</type>
<properties>
<cargo.hostname>10.110.2.161</cargo.hostname>
<cargo.remote.username>admin</cargo.remote.username>
<cargo.remote.password>admin123</cargo.remote.password>
<cargo.tomcat.manager.url>http://10.110.2.161:8080/manager</cargo.tomcat.manager.url>
</properties>
</configuration>
</configuration>
</plugin>