为了防止传递依赖,我们各个模块之间尽量用直接依赖的方式。本篇文章介绍多模块化开发。我们做过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. litepal更好的操作sqlite3,配置与基本操作

    litepal更好的操作sqlite3 配置 在app下的build.gradle中加入 创建litepal.xml配置 在app/src/main下面创建assets,新建litepal.xml & ...

  2. 5.IntellijIDEA常用快捷键总结

    转自:https://blog.csdn.net/qq_17586821/article/details/52554731下面的这些常用快捷键需要在实际操作中不断地体会才能真正感受到它们的方便之处. ...

  3. BZOJ 1174: [Balkan2007]Toponyms

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 735  Solved: 102[Submit][Status][Discuss] Descriptio ...

  4. 使用greenDAO遇到的问题

    前一阵花时间学习了一下greenDAO的使用,这两天已经把项目中之前使用的sqlite数据库操作改用greenDAO,但是在改动的过程中还是出了一些问题,问题主要集中在主键上,下面整理了一下在改动过程 ...

  5. YYDispatchQueuePool阅读笔记

    阅读了开源大神的YYDispatchQueuePool,在此记下一些从中学到的东西. 首先YYDispatchQueuePool.m文件中有如下类型对应: static inline dispatch ...

  6. IHttpHandler的学习(0-2)

    这个IHttpHandler,要想到asp.net生命周期 ,想到哪个从你发起请求开始,这个请求通过HttpModule------>IHttpHandler的: 执行HttpModule的一系 ...

  7. NetBios, NetBios over TCP/IP, SMB 之间的关系

    首先提到的是NetBios,NetBios是Network Basic Input/Output System的缩写,提供了一种允许局域网内不同电脑能够通信的功能.严格来说,NetBios是一套API ...

  8. vue分页组件火狐中出现样式问题

    分页的操作到了火狐浏览器会样式 怎么解决? 其实就是将input的type属性变成了text,因为number属性会变成上下的小箭头

  9. python的模块导入机制

    在python中用import或者from...import来导入相应的模块. 模块(Module)其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模 ...

  10. 【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿

    [转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时 ...