java开发,maven多模块项目管理的喜与恼

谈到java开发的多模块组织,我不禁乐道于maven的强大与高效,以至于在上一年进行前端规范化工作时,还时不时地拿gulpmaven进行对比。

谈到maven就不能不谈ant,早些年代的java库管理多是ant方式,项目需要什么jar包,就往项目的lib文件夹下塞,包出现了冲突解决起来比较费劲。Maven的方式叫做反应池,在项目中只需要一个pom.xml文件就可以管理包的依赖关系,而且可以通过视图能清晰地看到层次依赖关系,便于包冲突的分析与解决。而依赖的jar包文件放在当前用户的.m2文件夹下,打包时,又自动把依赖包组织起来。

Maven除了优秀的库依赖管理与插件依赖管理(这里暂时不多介绍),还有一个优秀的特性——项目模块依赖管理——这使得一个大的项目可以任意拆分成多个相对独立的原子功能(可以是业务功能点也可以是工具类库)。在实际工作中,我通常把工具类库打包成jar,把组织级别的业务功能点打包成war作为微服务。

Maven-module多模块组织固然有如此大的优势,但刚开始过度的原子化分割,是的项目后期维护出现了一定的难度:

一、前期技术储备不足,在eclipse中使用时,每次更新jar模块后,都要maven install下,把jar模块安装到本地库里。但这个问题是,随着项目模块的增加,没修改几行代码就要执行次这个命令,很耗费时间。当然,后期找到了正规的解决方法,但偶尔出现的问题,还是使得团队成员退回install方式。

二、后期维护成本较大。模块过多而且依赖复杂的后果就是,牵一发而动全身。有的功能,管理后台依赖了,会员也依赖了,一次改动,如果测试补充分,很容易添加新的bug.

三、新的团队成员上手难。复杂的项目结构,无疑为新成员设定了很高的门槛,光分析一个业务逻辑就好跨越好几个jar

根据以上几点,我把全公司的项目模块归类为两大类。一个是组织级别的框架模块,一个是项目级别的项目模块。框架模块可以成为项目前期技术选型的素材,优秀的项目模块又可以完善框架模块。两者相辅相成,当然两个都是通过maven-module的形式进行管理。

在业务系统中,在单体模式(这个项目就是一个war)与之前过度分割的原子模式之间进行折中。把整个项目定义为一个pom项目(maven项目有三种类型pom/jar/war),进行项目依赖库与插件的版本控制;每个业务端(比如,管理后台、商家后台、会员中心等)作为war模块,每个war模块相对独立,如果出现业务交集,通过前端调用不同war的接口进行整合,每个war模块所依赖的库或者插件都从父级的pom项目中选定。

业务系统中引来的工具类,在项目阶段审核后提交到框架模块的工具包里统一管理。业务系统中可重用的服务(如:登陆、鉴权、工作流等),则在框架模块中进一步抽象成为微服务。

一个项目的完成,不仅仅是交活收钱,对于公司来说,更大的财产是组织过程资产的积淀。

项目管理“铁三角”

项目的范围管理、时间管理、成本管理构成了决定项目成败(一般以项目的质量作为评估依据)的“铁三角”。范围扩大,要通过增加项目的时间与成本保证项目的质量,或者通过降低质量要求以符合时间或者成本的要求;时间压缩,要通过范围的缩小(分清主次)与增加成本(加人加班)的方式解决;成本缩减,要通过范围的缩小(分清主次)的方式处理。

当然,范围、时间、成本之间的制约关系是必然存在的,但在具体实施时,要根据具体项目的实际情况而采取合适的方法。——有的项目有不可变更的时间节点、有的有严格的质量要求、有的有明确的成本制约。

项目管理基础:九大知识领域与五大过程组

项目管理知识体系分为九大知识领域与五大过程组。

九大知识领域包括:范围管理、时间管理、成本管理、质量管理、整合管理、人力资源管理、沟通管理(包括干系人管理)、采购管理、风险管理。五大过程组包括:启动过程组、计划过程组、执行过程组、监控过程组与收尾过程组。以五大过程组为横坐标、九大知识领域为纵坐标构成的二维矩阵里分布着44个子过程(每个子过程又可以分为启动、计划、执行、监控、收尾五个阶段),每个子过程又有着自己的输入项、输出项与工具(方法论)。

继续阅读项目管理基础:九大知识领域与五大过程组