为了防止传递依赖,我们各个模块之间尽量用直接依赖的方式。本篇文章介绍多模块化开发。我们做过Maven项目的都知道。我们的项目一般都是分模块的,每一个模块都会相应着一个POM.xml文件,它们之间通过继承和聚合(也称多模块,multi-module)相互关联。

我们换还有一种思路想想,那么我们能不能一个项目就用一个模块。这样开起来非常方便,简单明了,那么做起来呢。接下来我们分析一下。

如果我们有这么一个项目,整个项目构建一个war包,而每一层放到各自的Package里面。例如以下:

Itoo-Exam

com.tgb.itoo.exam.dao  -----负责与数据库的交互,封装了Hibernate的交互类

com.tgb.itoo.exam.service----负责处理业务逻辑,放Service接口及事实上现类

com.tgb.itoo.exam.web-------负责与client的交互。主要放action/controller,jsp等等

com.tgb.itoo.exam.util--------工具类

那么随着我们项目的扩大,Maven项目也会越来越大,那么会遇到以下的几个问题:

1、首先build整个项目的时间越来越长,虽然你一直在web层工作,但你不得不build整个项目

2、模块化体现不出来。假设我们仅仅负责维护某个模块,由于我们全部的模块都在一个war包中。那么我们能够任意改动其它模块(权限的控制),导致版本号管理混乱,冲突。同一时候由于模块太多,太大。不好维护。

非常多人都在同一时候改动这个war包,将导致工作无法顺利进行。

3、pom.xml本来是能够继承、复用的,可是假设我们新建一个项目。仅仅能依赖于这个war包。那么会把这个war包的相关的前台的东西依赖过来,导致项目管理混乱。

这种管理是混乱的,没有遵守一个设计模式原则:“高内聚,低耦合”。

相反在代码内部,全部的东西都耦合在了一起。因此我们须要划分模块。

另外。随着技术的飞速发展和各类用户对软件的要求越来越高。软件本身变得越来越复杂,设计人员開始採用各种方式进行开发。于是就有了我们的分层架构、分层模块来提高代码的清晰和重用。

从而实现了系统内部的高内聚、低耦合。

实际上我们项目的包结构:

Itoo-root (pom.xml pom包)

Itoo-base-parent(pom.xml pom包)

Itoo-base(pom.xmljar包)

Itoo-tool(pom.xmljar包)

Itoo-exam-parent (pom.xml pom包)

Itoo-exam-api        (pom.xml jar包)

Itoo-exam-student-core  (pom.xml jar包)

Itoo-exam-student-web  (pom.xml war包)

Itoo-exam-student-ear   (pom.xml ear包)

如上关系图,pom包的全是父项目。用来管理子项目的jar包。parent里面聚合了非常多子项目。

模块的依赖关系:

Itoo-base--->itoo-tool

Itoo-exam-api-->itoo-base

Itoo-exam-student-core--->itoo-exam-api

Itoo-exam-student-web--->itoo-exam-api

模块化的优点

1、方便重用。当我们再开发一条teacher线的时候,我们仅仅须要引用itoo-base,itoo-exam-api。这些包都是复用的。称为我们平台复用的基础类库,供全部的项目使用。

这是模块化最重要的一个目的。

2、划分了模块,包之间的依赖关系很清晰,包的版本号管理也很清晰,不用再到一个混乱的pom中改动自己的配置了。

3、灵活性。比方我们这些公共的jar包,itoo-base,itoo-tool,itoo-exam-api等这些jar包,我们不须要再当源代码,仅仅须要deploy到nexus,其它人从nexus下载就可以。代码的可维护性、可扩展性好,而且保证了项目独立性与完整性。

4、build项目的时候。仅仅须要build自己所须要的项目,不仅节省时间并且结构清晰。

5、上篇文章写得DependencyManagement与dependencies。父项目中管理jar包版本号。使得整个项目的測试版本号与公布版本号一致。

使用模块化配置,复用性强。防止pom变得过于庞大,方便构建;针对项目的管理更方便,每个模块都是独立的,抽象出一个父类来管理第三方jar的版本号,开发者仅仅须要开发自己的线,其它的都不用管,灵活;基于此种基础我们还能够做分布式。

上面提到了我们用父项目聚合子项目。子项目继承父项目。下篇博客我们继续介绍Maven模块的聚合和继承。

Maven实战(八)---模块划分的更多相关文章

  1. Ionic2实战——按模块划分app 创建多module

    http://www.jianshu.com/p/d94324b722af 背景 用ionic2开发过一两个小功能的朋友都会发现,每新建一个页面都需要在\src\app\app.module.ts中添 ...

  2. 学习笔记——Maven实战(八)常用Maven插件介绍(下)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  3. 【转】Maven最佳实践:划分模块

    转自:http://juvenshun.iteye.com/blog/305865 “分天下为三十六郡,郡置守,尉,监” —— <史记·秦始皇本纪> 所有用Maven管理的真实的项目都应该 ...

  4. Maven最佳实践:划分模块

    http://juvenshun.iteye.com/blog/305865 ************************************* "分天下为三十六郡,郡置守,尉,监& ...

  5. 【转】Maven实战(九)---模块聚合和继承

    原博文出自于:http://blog.csdn.net/liutengteng130/article/details/47001831   感谢! 类之间有聚合和继承关系,Maven也具备这样的设计原 ...

  6. angularJs项目实战!01:模块划分和目录组织

    近日来我有幸主导了一个典型的web app开发.该项目从产品层次来说是个典型的CRUD应用,故而我毫不犹豫地采用了grunt + boilerplate + angularjs + bootstrap ...

  7. (转)Maven最佳实践:划分模块

    “分天下为三十六郡,郡置守,尉,监” —— <史记·秦始皇本纪> 所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块 ...

  8. Maven实战(八)——常用Maven插件介绍(下)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  9. (转)Maven学习总结(八)——使用Maven构建多模块项目

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(八)——使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为doma ...

  10. MAVEN最佳实践:模块划分

    转自:http://juvenshun.iteye.com/blog/305865 所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作 ...

随机推荐

  1. MinGW安装和使用基础教程

    MinGW全称Minimalist GNU For Windows,是个精简的Windows平台C/C++.ADA及Fortran编译器,相比Cygwin而言,体积要小很多,使用较为方便.MinGW提 ...

  2. js运算符单竖杠“|”与“||”的用法和作用介绍

    在js开发应用中我们通常会碰到“|”与“||”了,那么在运算中“|”与“||”是什么意思呢?   在js整数操作的时候,相当于去除小数点,parseInt.在正数的时候相当于Math.floor(), ...

  3. 机器学习规则:ML工程最佳实践----rules_of_ml section 1【翻译】

    作者:黄永刚 机器学习规则:ML工程最佳实践 本文旨在指引具有机器学习基础知识的工程师等人,更好的从机器学习的实践中收益.介绍一些应用机器学习需要遵循的规则,类似于Google C++ 风格指南等流行 ...

  4. 鼠标滑过,解决ul下 li下a的背景与父级Li不同宽的问题

    我们在写导航或者页面有超链接的地方,有一些是需要超链接的背景和Li的宽度一样的.但是,却没有达到这种效果?为什么? 我们做的效果图:如下 期望的效果:如下 出现这样的原因:由于a是个行内元素,它没有宽 ...

  5. Kinect 人机交互开发实践

    Kinect for Windows SDK 骨骼追踪 —— 对在Kinect视野范围内移动的一个或两个人进行骨骼追踪,可追踪到人体的20个节点 深度摄像头 —— 通过深度传感器获取到视野内的环境三维 ...

  6. 976 B. Lara Croft and the New Game

    You might have heard about the next game in Lara Croft series coming out this year. You also might h ...

  7. 优秀的Linux文本编辑器 (转载)

    想要挑起狂热Linux爱好者之间的激烈争辩吗?那就问问他们最喜欢的文本编辑器是什么吧.在开源社区中,选择一个用来写文本,或者更进一步,用来写代码的编辑器,比选择一个球队或者游戏控制器还要重要.但是任何 ...

  8. MySQL 大数据量文本插入

    导入几万条数据需要等好几分钟的朋友来围观一下! 百万条数据插入,只在一瞬间.呵呵夸张,夸张!! 不到半分钟是真的! 插入指令: load data infile 'c:/wamp/tmp/Data_O ...

  9. 洛谷1440 求m区间的最小值 单调队列

    题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入格式: 第一行两个数n,m. 第 ...

  10. TCP学习前的准备——可靠数据传输协议

    由于传输层所依赖的网络层是不可靠的,通过逐渐考虑实际情况不断引入新技术来实现可靠数据传输. 完全可信的信道 有比特差错的信道 新的协议功能: 1.    差错检测:检验和 2.    接收方反馈:序号 ...