1.Web项目的目录结构
基于Java的Web项目,标准的打包方式是WAR。与JAR比较,包含更多的内容,比如JSP文件、Servlet、Java类、web.xml配置文件、依赖JAR包、静态web资源(HTML、CSS、JavaScript)等。
一个典型的WAR文件如下目录结构:
—war/ + META-INF/ + WEB-INF/ | + classes/ | | + ServletA.class | | + config.properties | | + ... | + web.xml + img/ + css/ + js/ + index.html + sample.jsp
一个WAR包下至少包含两个子目录:META-INF和WEB-INF,前者包含了一些打包元数据信息;后者是WAR包的核心,WEB-INF下必须包含一个Web资源描述文件web.xml,它的子目录classes包含所有该Web项目的类,而另一个子目录lib则包含所有该Web项目的依赖JAR包。classes和lib目录都会在运行的时候被加入到Classpath中。除此之外,WAR包中会包含很多Web资源,比如html、jsp、图片等。
Maven对Web项目的布局结构也有一个通用的约定,Web项目必须显示的指定打包方式为war
4.0.0 com.gqshao.myapp project-a 1.0-SNAPSHOT war project-a
Web项目的类及资源文件同一般JAR项目一样,默认位置都是src/main/java和src/main/resources
Web项目比较特殊的地方在于:它还有一个Web资源目录,其默认位置是src/main/webapp/。一个典型Web项目的Maven目录结构如下:
+ project + pom.xml + src | + main/ | | + java/ | | | + ServletA.class | | | ... | | + ... | + resources/ | | + config.properties | + webapp/ | | + WEB-INF/ | | | + web.xml/ | | + img/ | | + css/ | | + js/ | | + index.html/ | | + sample.jsp/ | + test/ | | + java/ | + resources
在src/main/webapp/目录下,必须包含一个子目录WEB-INF,该子目录还必须要包含web.xml文件
2. web项目的POM
4.0.0 com.gqshao.myapp learn-maven war 0.0.1-SNAPSHOT myapp.learn_maven Maven Webapp 3.2.2.RELEASE 4.7 junit junit 3.8.1 test javax.servlet servlet-api 2.4 provided javax.servlet.jsp jsp-api 2.0 provided src/main/resources true test org.mortbay.jetty jetty-maven-plugin 8.1.10.v20130312 10 /test
(1)packaging元素值为war
(2)几乎所有的Web都要依赖于servlet-api和jsp-api,但这两个依赖范围是provided,表示他们最终不会被打包至war文件中,因为web容器会提供这两个类库。
(3)build-finalName:用来标识项目生成的主构件的名称,改变该元素的默认值,方便部署。
3.使用jetty-maven-plugin进行测试
Web页面测试应该仅限于页面的层次,例如JSP、CSS、JavaScript的修改,其他代码的修改(如数据访问)、请编写单元测试。
传统的Web测试方法要求我们编译、测试、打包及部署,jetty-maven-plugin能够帮助我们节省时间,它能够周期性的检查项目内容,发现变更后自动更新到内置的Jetty Web容器中,也就是帮我们省去了打包和部署的步骤。通常情况下,我们只需要在IDE中修改源码,IDE能够执行自动编译,jetty-maven-plugin发现编译后的文件变化后,自动更新到Jetty容器,就可以直接测试Web页面了。
jetty-maven-plugin配置
org.mortbay.jetty jetty-maven-plugin 8.1.10.v20130312 10 /test
注意:
(1)jetty-maven-plugin不是官方Maven插件,需要注意groupId和artifactId;scanIntervalSeconds表示该插件扫描项目变更的时间间隔,单位是秒;contextPath表示项目部署后的content path。http://hostname:port/{contextPath}/
(2)默认情况下,只有org.apache.maven.plugins和org.codehaus.mojo两个groupId下的插件才支持简化的命令行调用,即可以运行mvn help:system。为了能在命令行直接运行mvn jetty:run,用户需要配置setting.xml如下:
org.mortbay.jetty org.eclipse.jetty
如果希望使用其它端口,可以添加jerry.port参数;跳过测试为maven.test.skip
mvn jetty:run -Djetty.port=80 -Dmaven:test:skip=true
4.使用Cargo实现自动化部署
Cargo是一组帮助用户操作Web容器的工具,它能够帮助用户实现自动化部署,而且它几乎支持所有Web容器,如Tomcat、JBoss、Jetty和Glassfish等。Cargo通过cargo-maven2-plugin提供了Maven继承,Maven用户可以使用该插件将Web项目部署到Web容器中。
cargo-maven2-plugin和jetty-maven-plugin的功能看起来很相似,但目的不同。jetty-maven-plugin主要是帮助日常的快速开发和测试,而cargo-maven2-plugin主要服务于自动化部署。
(1)部署至本地Web容器
Cargo支持两种本地部署的方式,分别为standalone模式和existing模式。在standalone模式中,Cargo会从Web容器的安装目录复制一份配置到用户指定的目录,然后在此基础上部署应用,每次重新构建的时候,这个目录都会被清空,所有配置重新生成;existing模式中,用户需要指定现有的Web容器配置目录,然后Cargo会直接使用这些配置并将应用部署到其对应的位置。
standalone/模式部署应用至本地Web容器
在setting.xml中添加<pluginGroup>org.codehaus.cargo</pluginGroup>org.codehaus.cargo cargo-maven2-plugin 1.4.0 tomcat7x D:\myspaces\worktools\apache-tomcat-7.0.37 existing D:\myspaces\WorkTools\apache-tomcat-7.0.37
运行命令:mvn cargo:start
(2)部署至远程Web容器
首先修改tomcat\conf\tomcat-users.xml中添加用户
POM配置如下
org.codehaus.cargo cargo-maven2-plugin 1.4.0 tomcat7x remote runtime tomcat tomcat http://localhost/manager