设为首页 收藏本站
查看: 844|回复: 0

[经验分享] 使用Maven构建Web项目的目录结构

[复制链接]

尚未签到

发表于 2017-3-1 09:02:54 | 显示全部楼层 |阅读模式
  1.Web项目的目录结构
  基于Java的Web项目,标准的打包方式是WAR。与JAR比较,包含更多的内容,比如JSP文件、Servlet、Java类、web.xml配置文件、依赖JAR包、静态web资源(HTML、CSS、JavaScript)等。
  一个典型的WAR文件如下目录结构:
  File-system代码 DSC0000.png
  
       
  • —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
  Xml代码
  
       
  • <project>   
  • <modelVersion>4.0.0</modelVersion>   
  • <groupId>com.gqshao.myapp</groupId>   
  • <artifactId>project-a</artifactId>   
  • <version>1.0-SNAPSHOT</version>   
  • <packaging>war</packaging>   
  • <name>project-a</name>   
  • </project>
  Web项目的类及资源文件同一般JAR项目一样,默认位置都是src/main/java和src/main/resources
  Web项目比较特殊的地方在于:它还有一个Web资源目录,其默认位置是src/main/webapp/。一个典型Web项目的Maven目录结构如下:
  File-system代码
  
       
  • + 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
  Xml代码
  
       
  • <project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;   
  • xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;>   
  • <modelVersion>4.0.0</modelVersion>   
  • <groupId>com.gqshao.myapp</groupId>   
  • <artifactId>learn-maven</artifactId>   
  • <packaging>war</packaging>   
  • <version>0.0.1-SNAPSHOT</version>   
  • <name>myapp.learn_maven Maven Webapp</name>   
  •    
  • <properties>   
  • <springframework.version>3.2.2.RELEASE</springframework.version>   
  • <junit.version>4.7</junit.version>   
  • </properties>   
  •    
  • <dependencies>   
  • <dependency>   
  • <groupId>junit</groupId>   
  • <artifactId>junit</artifactId>   
  • <version>3.8.1</version>   
  • <scope>test</scope>   
  • </dependency>   
  • <dependency>   
  • <groupId>javax.servlet</groupId>   
  • <artifactId>servlet-api</artifactId>   
  • <version>2.4</version>   
  • <scope>provided</scope>   
  • </dependency>   
  • <dependency>   
  • <groupId>javax.servlet.jsp</groupId>   
  • <artifactId>jsp-api</artifactId>   
  • <version>2.0</version>   
  • <scope>provided</scope>   
  • </dependency>   
  • </dependencies>   
  • <build>   
  • <resources>   
  • <resource>   
  • <directory>src/main/resources</directory>   
  • <filtering>true</filtering>   
  • </resource>   
  • </resources>   
  • <finalName>test</finalName>   
  • <plugins>   
  • <plugin>   
  • <groupId>org.mortbay.jetty</groupId>   
  • <artifactId>jetty-maven-plugin</artifactId>   
  • <version>8.1.10.v20130312</version>   
  • <configuration>   
  • <scanIntervalSeconds>10</scanIntervalSeconds>   
  • <webAppConfig>   
  • <contextPath>/test</contextPath>   
  • </webAppConfig>   
  • </configuration>   
  • </plugin>   
  • </plugins>   
  • </build>   
  • </project>
  (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配置
  Xml代码
  
       
  • <build>   
  • <plugins>   
  • <plugin>   
  • <groupId>org.mortbay.jetty</groupId>   
  • <artifactId>jetty-maven-plugin</artifactId>   
  • <version>8.1.10.v20130312</version>   
  • <configuration>   
  • <scanIntervalSeconds>10</scanIntervalSeconds>   
  • <webAppConfig>   
  • <contextPath>/test</contextPath>   
  • </webAppConfig>   
  • </configuration>   
  • </plugin>   
  • </plugins>   
  • </build>
  注意:
  (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如下:
  Xml代码
  
       
  • <settings>   
  • <pluginGroups>   
  • <pluginGroup>org.mortbay.jetty</pluginGroup>   
  • <!-- 8、9 -->   
  • <pluginGroup>org.eclipse.jetty</pluginGroup>   
  • </pluginGroups>   
  • </settings>
  如果希望使用其它端口,可以添加jerry.port参数;跳过测试为maven.test.skip
  Dos代码
  
       
  • 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容器
  Java代码
  
       
  • <plugin>   
  •     <groupId>org.codehaus.cargo</groupId>   
  •     <artifactId>cargo-maven2-plugin</artifactId>   
  •     <version>1.4.0</version>   
  •     <configuration>   
  •         <container>   
  •             <containerId>tomcat7x</containerId>   
  •             <home>D:\myspaces\worktools\apache-tomcat-7.0.37</home>   
  •         </container>   
  •         <configuration>   
  •             <!-- standalone模式部署应用至本地Web容器 -->   
  •             <!--   
  •             <type>standalone</type>   
  •             <home>${project.build.directory}\tomcat7x</home>   
  •             -->   
  •             <!--  cargo.servlet.port属性修改监听端口 -->   
  •             <!--   
  •             <properties>   
  •                 <cargo.servlet.port>80<cargo.servlet.port>   
  •             </properties>   
  •             -->   
  •             <!-- existing模式部署应用至本地Web容器 -->   
  •             <type>existing</type>   
  •             <home>D:\myspaces\WorkTools\apache-tomcat-7.0.37</home>   
  •         </configuration>   
  •     </configuration>   
  • </plugin>
  在setting.xml中添加<pluginGroup>org.codehaus.cargo</pluginGroup>
  运行命令:mvn cargo:start
  (2)部署至远程Web容器
  首先修改tomcat\conf\tomcat-users.xml中添加用户
  Xml代码
  
       
  • <role rolename=&quot;manager-gui&quot;/>   
  • <user username=&quot;tomcat&quot; password=&quot;tomcat&quot; roles=&quot;manager-gui&quot;/>
  POM配置如下
  Xml代码
  
       
  • <plugin>   
  • <groupId>org.codehaus.cargo</groupId>   
  • <artifactId>cargo-maven2-plugin</artifactId>   
  • <version>1.4.0</version>   
  • <configuration>   
  • <container>   
  • <containerId>tomcat7x</containerId>   
  • <type>remote</type>   
  • </container>   
  • <configuration>   
  • <type>runtime</type>   
  • <properties>   
  • <cargo.remote.username>tomcat</cargo.remote.username>   
  • <cargo.remote.password>tomcat</cargo.remote.password>   
  • <cargo.remote.manager.url>http://localhost/manager</cargo.remote.manager.url>   
  • </properties>   
  • </configuration>   
  • </configuration>   
  • </plugin>
  (1)远程部署container元素的type子元素的值必须为remote。否则默认的值为installed,并寻找对应的容器安装目录或者安装包,对于远程部署来说安装目录或者安装包是不需要的。
  (2)configuration的type子元素值为runtime,表示既不使用独立的容器配置,也不使用本地现有的容器配置,而是依赖于一个已运行的容易;properties声明一些容器热部署的相关配置。
  (3)运行命令 mvn cargo:redeploy

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348590-1-1.html 上篇帖子: java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarte 下篇帖子: 使用JMeter测试基于WebSocket协议的服务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表