为了防止传递依赖,我们各个模块之间尽量用直接依赖的方式。本篇文章介绍多模块化开发。我们做过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. Delphi的时间 x87 fpu control word 精度设置的不够

    在win7 64位系统下, 一个DELPHI写的DLL注入一个C语言程序后. 出现非常奇怪的浮点数相加出错的情况. (注: 在XP系统下是正常的).比如: 40725.0001597563 + 0.7 ...

  2. ListView实现丰富的列表功能

    ListView实现丰富的列表功能 1.主布局activity_main.xml <?xml version="1.0" encoding="utf-8" ...

  3. 搭建Hadoop的全分布模式

    此教程仅供参考 注意:此文档目的是为了本人方便以后复习,不适合当教程,以免误导萌新... 1.安装三台Linux2.在每台机器上安装JDK3.配置每台机器的免密码登录 (*) 生成每台机器的公钥和私钥 ...

  4. vmware workstation虚拟机克隆后不能上网(桥接模式下)

    (CentOS6.8下) 重启新克隆的虚拟机,输入用户名密码,进入系统. 1.修改网卡配置,输入 vi /etc/sysconfig/network-scripts/ifcfg-eth0 出现类似如下 ...

  5. <Sicily>Funny Game

    一.题目描述 Two players, Singa and Suny, play, starting with two natural numbers. Singa, the first player ...

  6. 函数响应式编程(FRP)从入门到”放弃”——基础概念篇

    前言 研究ReactiveCocoa一段时间了,是时候总结一下学到的一些知识了. 一.函数响应式编程 说道函数响应式编程,就不得不提到函数式编程,它们俩到底有什么关系呢?今天我们就详细的解析一下他们的 ...

  7. SSD-实现

    一.制作voc数据集 1.数据集文件夹 新建一个文件夹,用来存放整个数据集,或者和voc2007一样的名字:VOC2007 然后像voc2007一样,在文件夹里面新建如下文件夹: 2.将训练图片放到J ...

  8. NodeJS学习笔记 进阶 (13)Nodejs进阶:5分钟入门非对称加密用法

    个人总结:读完这篇文章需要5分钟,这篇文章讲解了Node.js非对称加密算法的实现. 摘录自网络 地址: https://github.com/chyingp/nodejs-learning-guid ...

  9. JS获取当前时间(YYYY-MM-DD ),element显示默认当前时间,显示默认昨天,显示默认上个月

    原文链接:点我 进来的随便看看,或许有帮助 vue+element-ui   datepicker 设置默认日期用的框架是vue+element-ui ,以下是时间控件 <el-form-ite ...

  10. BZOJ 3110 [Zjoi2013]K大数查询(整体二分)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 11654  Solved: 3505[Submit][St ...