为了防止传递依赖,我们各个模块之间尽量用直接依赖的方式。本篇文章介绍多模块化开发。我们做过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. node04---fs文件操作、静态服务器

    08fs.js var http = require("http"); var fs = require("fs"); var server = http.cr ...

  2. zoj_3657,12年长春站c题,模拟

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> us ...

  3. hdu_1166,线段树单点更新

    在刷线段树,参考自http://www.notonlysuccess.com/index.php/segment-tree-complete/ #include<iostream> #in ...

  4. ListView的setOnItemClickListener回调不能执行的解决

    如果ListView中的单个Item的view中存在checkbox,button等view,会导致ListView.setOnItemClickListener无效,事件会被子View捕获到,Lis ...

  5. Maven项目:Plugin execution not covered by lifecycle configuration 解决方案

    这个是eclipse中配置文件pom.xml报的错.具体错误信息: Plugin execution not covered by lifecycle configuration: org.apach ...

  6. 机器学习(一) K-means聚类

    聚类算法K-means是硬聚类算法,是目标函数聚类算法的代表.K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小.算法采用误差平方和准则函数作为聚 ...

  7. 2018年湘潭大学程序设计竞赛 Fibonacci进制

    Fibonacci数是非常有名的一个数列,它的公式为 f(n)=f(n-1)+f(n-2),f(0)=1,f(1)=2.  我们可以把任意一个数x表示成若干不相同的Fibonacci数的和, 比如说1 ...

  8. MyEclipse for mac 快捷键

    原文出处:http://blog.csdn.net/ray_seu/article/details/17384463 一直比较欣赏myeclipse的快捷键,网上搜索了一圈,发现windows平台下面 ...

  9. Ubuntu18.06 Mate桌面环境下VirtuslBox打开虚拟机“全局菜单”异常退出解决办法

    在安装完Ubuntu18.06 Mate桌面环境后在VirtuslBox里打开虚拟机会出现“全局菜单”异常退出问题. 产生上面问题的原因是你的虚拟机可能在 显示= >屏幕= >硬件加速里勾 ...

  10. Rman备份及不完全恢复操作

    最后更新时间:2018/12/18 启用归档 --检查是否为归档 SQL> archive log list; Database log mode              No Archive ...