出处:http://www.cnblogs.com/whgk/p/7121336.html

前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ssh项目分割为不同的几个部分独立开发,很重要,加油

                              --WH

一、maven父工程与子模块的拆分与聚合原理

      问题描述:将ssh工程拆分为多个模块开发

      1.1、拆分原理

        创建一个maven project(pom),然后在创建三个子模块(maven moudule),其中三个子模块,分别为 dao、service、web,也就是将三层的内容分别独立为一个项目,进一步将耦合性降低,其中如何将他们连接起来了,看下图。

                  

        为什么需要创建parent父工程来管理其下三个子模块呢?并让其子模块继承他呢?

          继承是为了消除重复,如果将dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复,比如:设置编译版本、锁定spring的版本的等,可以将这些重复的配置提取出来在父工程的pom.xml中定义

        将三层都独立分开来了,web层如何调用service层代码?service层又如何调用dao层的代码呢?

          这个在没有maven之前是不可以这样做的,但是有了maven一切都不一样了,web层调用service层的代码其实很简单,因为service是一个完整的项目,那么我们在web层这个项目中想要使用别得项目中的代码,只需要通过maven的pom.xml文件编写对应的坐标,将其jar包加入进来即可达到目的,因此,看图中,ssh-web依赖ssh-service,ssh-service依赖ssh-dao,其中的原理就是我说的这样,所以才能将这三层分开成独立的项目,并且进一步抽取其公有依赖的jar包,统一交由父工程来管理,这就maven带来的效果。

      1.2、聚合原理

        项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web三个工程最终会打一个独立的war运行

      

二、案例实现

      问题描述:使用maven将ssh项目进行分模块,并且实现从web到dao层的数据的存取进行实验

      2.1、创建maven-parent父模块

                  

        点击next

                  

        点击next

                  

        创建好之后的父工程如图  

              

        从它的目录结构可以看出,父工程本身不写代码,它里面有一个pom.xml文件,这个文件可以将多个子模块中通用的jar所对应的坐标,集中在父工程中配置,将来的子模块就可以不需要在pom.xml中配置通用jar的坐标le、

        在父工程的pom.xml中抽取一些重复的配置的,比如:锁定jar包的版本、设置编译版本等,一般这种都不需要我们自己临时配置,网上或者公司都有已经写好了的,每次使用就直接丢过来即可。下面给一个我收藏的额。嘿嘿

 maven父工程整合ssh通用的pom.xml配置

      2.2、创建maven-dao子模块

              

        点next进入如下图

                   

        点击next,如下图

               

                    

        点击finish,完成,查看父工程中的pom.xml文件

              

        查看ssh_dao中的pom.xml文件,会发现多了一个 parent结点,并且内部所包含的结点,其实就是父工程的坐标

              

        查看ssh_dao的目录结构

              

        因为是在dao层,和数据库打交道,那么就在这个项目中,需要配置hibernate.hbm.xml和hibernate.cfg.xml,但是又集成了spring,所以hibernate.cfg.xml就不需要了,添加applicationContext.xml即可(这里需要有spring整合hibernate的基础)

                

        注意:将applicationContext.xml拆分出一个applicationContext-dao.xml,此文件中只配置dao

 aplicationContext-dao.xml
 jdbcinfo.properties

        其他几个Student.java这些就不用看了,太简单了。

        StudentTest.java这个需要讲解一下,因为这里使用junit测试的时候,会报错,报的错误是找不到junit的jar包,这里我们就会很疑惑,为什么会找不到该jar包呢,不是在父工程里面都导入了junit的jar包了吗?这里出错的原因是传递依赖的范围问题。

        将父工程看做A项目(下面简称A),将该子模块ssh_dao看做B项目(下面简称B),A依赖junit的jar包是直接依赖。B继承A(实际操作就是B中填写A的坐标)也可以看成一种依赖,那么就是这样一种关系,B 依赖 A 依赖 junit, A依赖junit是直接依赖没错,那么B跟junit的关系就叫做传递(间接)依赖,我们知道A依赖的junit时,junit的jar包可以设置在A中的使用范围,就是scope属性,可以为compile,test等,而junit设置的是test,只在A中测试的时候用,那么B想用junit时,junit的作用范围是不是也是test呢?这就有一种关系。具体看表。

                

         按照刚才上面的例子,来看看在B中,junit的作用范围是什么?首先看B 依赖 A,直接依赖,并且A在B中的作用范围是compile(没设置就默认),所以在直接依赖这一列中找到compile这一行,也就是用红色框框框起来的一行,然后B 依赖 junit,对A来说,A 是传递依赖 junit,这时候看junit设置的作用范围是多少(也就是看junit在B中的使用范围是什么)?看传递依赖这一行,junit设置的是test,找到test这一列,看相交的地方,是空的,则说明,junti在B中的test范围不能够使用,其实看图,B中任何范围内都不能够使用junit,这样你就理解了这张图是什么意思。这只是原理,实际上我们解决这种问题的时候,用一个简单粗暴的解决方案。什么jar包丢失了,我们就再次导入一次jar包即可。

          所以在ssh_dao子模块的pom.xml中有junit的坐标才能使用test

                

                               

        

      2.3、创建ssh_service子模块

          方法同ssh_dao模块创建方法一样,模块名称为ssh_service。

          看ssh_service和ssh_parent的pom.xml文件,会出现和ssh_dao创建时一样的情况,ssh_service多出一个parents结点,ssh_parent多个一个module结点

                

          在ssh_service的pom.xml中添加两个依赖

                

           然后编写service层的代码,

                    

           主要关注一下applicationContext-service.xml中的事务的相关代码

 aplicationContext-service.xml

            该层的测试,需要将ssh_dao中的applicationContext-dao.xml将ssh_service的applicationContext-service.xml包含进去才能够实验的通。这里不做测试,

      2.4、创建ssh_web子模块

          方法同maven-dao模块创建方法,模块名称为ssh-web,注意:打包方式为war,而不再是jar包了,因为该层需要放到tomcat中去。与浏览器交互,就是web项目了,所以打成war包

          和前面一样,ssh_parent的pom.xml中增加一个module结点,而ssh_web的pom.xml中增加一个parent结点

          这个也很简单,就是跟写普通的struts2是一样的,只不过是和spring的结合,有什么对象,都通过spring来给予,并且这里多做一个事情,就是将之前的applicationContext配置文件进行结合,看下图

                    

 application.xml

          web.xml中配置struts2的拦截器和spring的监听器

 web.xml

          这里注意一个问题,struts跟spring整合的时候,Struts.xml中的class应该填写spring配置文件中的id。

      2.5、总结与启动

           父工程和子模块都写完之后,就成这样了

              

                        

           运行调试即可。这里我遇到一个小问题,一直解决不了,

              

三、总结

      理解了这个分模块与聚合的作用,并且知道如何开发即可。加油。确实搞的有点烦躁。

转帖:maven(二) maven项目构建ssh工程(父工程与子模块的拆分与聚合)的更多相关文章

  1. maven(二) maven项目构建ssh工程(父工程与子模块的拆分与聚合)

    前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ssh项目分割为不同的几个部分独立开发,很重要,加油 --WH 一.maven父工程与子模块的拆 ...

  2. maven多模块项目构建

    描述 一个大的企业级项目通常跨越了数十万行代码,牵涉了数十或数百软件人员的努力.如果开发者在同一个项目下开   发,那么项目的管理.构建将会变得很难控制.因此设计人员会将项目划分为多个模块,多个模块独 ...

  3. 基于maven的JavaWeb项目构建部署

    需要准备的安装文件: 1 JDk http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html jdk-8 ...

  4. 使用eclipse搭建maven多module项目(构建父子项目)

    创建空maven项目 File–>new–>project… 2.next 3.next 4.finish 5.配置pom.xml <project xmlns="http ...

  5. jenkins(二)项目构建

    通过上一篇“jenkins(一)集成环境搭建示例”,已经完成了jenkins的安装,基本配置,启动,下面继续小结jenkins使用 一.jenkins系统配置 访问jenkins,点击系统管理-> ...

  6. SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程

    一,创建Maven多模块项目先建立外层父工程         File →new →project  选择Spring Initializr          Next下一步到以下页面 工程结构如下 ...

  7. 项目构建工具maven的使用方法

    最近在开发javaweb项目中有用到maven,以前并不是很了解,于是学习了一些相关内容,记之共享. 本篇内容在Windows环境下实施,JDK版本使用的1.7.0_79. 一.maven是什么? 简 ...

  8. 用 Maven 做项目构建

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-maven/index.html 本文将介绍基于 Apache Maven 3 的项目构建的基本概念 ...

  9. 转帖 maven(一) maven到底是个啥玩意~

    转载自:https://www.cnblogs.com/whgk/p/7112560.html 我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清 ...

随机推荐

  1. 服务器修改静态ip

    ifconfig,看当前网卡名字 设置 ip地址,子网掩码 ,广播地址 ifconfig eth1 172.16.11.25 netmask 255.255.255.0 broadcast 172.1 ...

  2. Nginx 常用基础模块

    目录 Nginx 常用基础模块 Nginx日志管理 nginx日志切割 Nginx目录索引 Nginx状态监控 Nginx访问控制 Nginx访问限制 Nginx 请求限制配置实战 Nginx Loc ...

  3. 2019牛客暑期多校训练营(第七场)E F H I

    E Find the median 题意:每次往序列中增加连续的[l,r]的数,每加入一次就询问当前序列的中位数. 解法:此题没有要求在线,那么直接离线+线段树+二分就可以了.求出每个端点之后排序得到 ...

  4. C++ 虚函数和多重继承的内存布局初探

    C++ 对象的内存布局 一切以事实说话: 代码: 1: #include <stdio.h> 2:  3: class A { 4: public: 5: int a; 6: int b; ...

  5. Java高频经典面试题(第一季)四:方法的参数传递机制

    考点? 方法的参数传递机制 String,包装类等对象的不可变性 方法的参数传递机制: ①形参是基本数据类型 传递数据值 ②实参是引用数据类型 传递地址值 特殊的类型:String.包装类等对象不可变 ...

  6. 【Flutter学习】之DateTime日期转换

    概述: 表示一个时间点 通过构造函数或解析格式化的字符串创建DateTime对象,并且符合ISO 8601标准的子集,小时是24小时制,范围在0-23之间 DateTime对象创建之后,将是固定不变的 ...

  7. Requests使用

    Requests 简介 Requests库 requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到.可以说,**Requests 完全满足如今网络的需求 ...

  8. Map、Filter和Reduce函数(Python)

    Map map(function_to_apply, list_of_inputs) 设有以下代码: >>> items = [1, 2, 3, 4, 5] >>> ...

  9. jquery实现简单的搜索功能

    管理系统中需要实现导航列表的搜索功能,写了一个简单的小栗子: <!DOCTYPE html> <html lang="en"> <head> & ...

  10. tomcat部署项目遇到的问题

    场景:在一台服务器上部署多个Tomcat,每个Tomcat下运行各自的项目 * )启动Tomcat startup.cmd报错: java.lang.Exception: Socket bind fa ...