引言

此文不是纯粹介绍maven概念,而是介绍一个具体的maven项目文件规划

这个规划可能适合于研发比较复杂的业务,这些业务有分布式服务化的需要。

这个规划能够解决因为分布式和服务化要求而引起的项目繁多,项目混乱的问题。

与此同时这个规划也可以解决了在项目研发中出现的重复“轮子”的问题。这些“轮子”主要来源于两类:

  1. 代码的重复“轮子”,所以要抽取项目,导致项目数量进一步增多。
  2. 人工构建项目的重复“轮子”,构建的关系越来越复杂,错误率也越来越高,所以要通过基于配置和约定的方法来实现自动化构建。

其他的不多赘述,直接上干货。

实际的规划图

所有parent的公用职责

  1. 构建它下面聚合的所有项目。约定是只聚合它子目录的项目,不能跨目录去聚合
  2. 管理它聚合的项目的通用特性,即存在继承关系。这些通用特性,是从它聚合的项目本身抽取的职责而来。约定这个继承和聚合使用同一个项目。
  3. 统一管理它聚合的项目中使用依赖其他项目或者jar的版本。聚合的项目只允许依赖它下层的项目。具体分层,看下文的分层依赖关系

we-parent的职责

  职责:一键构建所有需要发布的项目。

  通用特性:

  1. 所有项目初始时就带有这些jar包的依赖,例如:testng(单元测试相关),h2(单元测试相关),easymock(单元测试相关),lombok(根据注释自动生成setter和getter)
  2. 所有项目的额外特性,例如:单元测试插件
  3. 项目发布管理,例如:私一的maven私服配置

we-core-parent的职责

  职责:它所聚合的的项目与业务没有关联的,只提供基础能力。简称:core项目。例如:数据库持久能力,redis缓存能力,http封装能力,通用工具能力等。

  通用特性:

  • Javadoc插件,用于生成javadoc

we-base-parent的职责

  职责:它所聚合的的项目有且只能代表一个真实存在而且能独立存在核心实体对应的业务,简称:base项目。

  概念解释:

  • 真实存在:即可以用一个具体的客观物体承载的。比如:用户,课程,试题
  • 独立存在:不依赖于其他的任何业务,放在哪里都可以独自呈现。比如:试题放在哪里都可以显示,课程放在任何地方也可以呈现。
  • 核心实体:一个业务服务其实通过一个实体就可以来实现了,顶多是字段属性多一些、实现复杂一些。为了更好的实现,我们可以会把这个实体拆分成很多。但是不管拆分多少个实体,总会有一个是最为重要的,其他的实体如果没有这个实体就没有任何意义。比如试题抽象成试题实体和答案实体。如果没有试题的存在,答案是没有存在的意义的。所以试题就是核心实体。

  通用特性:暂无

we-business-parent的职责

  职责:它所聚合的的项目必须是一个提供“共享”业务流程,简称:business项目。在这个流程过程中有可能需要引用base服务。它本身没有一个真实存在而且能独立存在核心实体

  概念解释:

  共享:在产品规划上,该服务可能会被多个产品使用,即为共享。

  通用特性:

  • 统一引用数据库持久能力,即数据库实现项目。

we-web-parent的职责

  职责:它所聚合的的项目可以通过互联网向用户提供服务,在产品规划上它自己独有的不被共享的业务,简称:web项目。

  通用特性:

  • 统一引用http解析能力。对http的解析及渲染。
  • 监控相关

分层依赖关系

除了we-parent,每一个parent对应的职责就是一个项目分层。这些项目分层的从上到下的关系如下图。

        

如何使用

  假设:现在来一个产品稿(prd,原型或者定稿需求)

  使用步骤如下:

  1. 分析一下,这个产品是否要对用户独立提供服务,不受其他的产品影响。如果要,则新建web项目。
  2. 分析一下,这个产品有没有哪些业务是准备被其他产品使用的,即在其他产品的界面有没有体现本产品。
  3. 如果有,分析一下这些公用的业务,有没有包含一个流程性,即它的业务在组合其他已有base项目。如果有,新建一个business项目
  4. 分析一下,这个产品有没有可以独立存在,不依赖于任何其他服务的业务。如果有,新建一个base项目。
  5. 当实现这些编码时,如果有遇到一些与业务无关的,只提供能力的,则新建一个core项目。

  总结来说:就是分析的时候根据分层,从上到下。把每一层的职责分析一下,如果有则新建一个。每一个项目,都必须建在对应的parent之下。

基于分布式、服务化的maven项目文件规划的更多相关文章

  1. [python] A*算法基于栅格地图的全局路径规划

    # 所有节点的g值并没有初始化为无穷大 # 当两个子节点的f值一样时,程序选择最先搜索到的一个作为父节点加入closed # 对相同数值的不同对待,导致不同版本的A*算法找到等长的不同路径 # 最后c ...

  2. ASP.NET WebApi 基于分布式Session方式实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起学玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NETWebSer ...

  3. ASP.NET WebApi 基于分布式Session方式实现Token签名认证(发布版)

    一.课程介绍 明人不说暗话,跟着阿笨一起学玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NETWebSer ...

  4. 构建基于分布式SOA架构的统一身份认证体系

    摘要:本文充分利用SOA架构松耦合的特点,通过规范统一网络接口实现业务系统整合,既提升系统安全性,又简化资源访问操作,具有重要的理论和现实意义. 统一身份认证旨在将分散在各个信息系统中的用户和权限资源 ...

  5. 2016全国研究生数学建模A题多无人机协同任务规划——基于分布式协同多旅行商MTSP遗传算法

    MTSP问题是指:有Ⅳ个城市,要求旅行商到达每个城市各一次,且仅一次,并[旦 1到起点,且要求旅行路线最短.而多旅行商问题M个旅行商从同一个城市(或多个城市)出发.分羽走一条旅路线,且总路程缀短.有关 ...

  6. IDEA + SpringBoot + maven 项目文件说明

    Springboot + maven + IDEA + git 项目文件介绍 1..gitignore  分布式版本控制系统git的配置文件,意思为忽略提交 在 .gitingore 文件中,遵循相应 ...

  7. 基于tomcat插件的maven多模块工程热部署(附插件源码)

    内容属原创,转载请注明出处 写在前面的话 最近一直比较纠结,归根结底在于工程的模块化拆分.以前也干过这事,但是一直对以前的结果不满意,这会重操旧业,希望搞出个自己满意的结果. 之前有什么不满意的呢? ...

  8. 基于分布式框架 Jepsen 的 X-Cluster 正确性测试

    转自:https://mp.weixin.qq.com/s/iOe1VjG1CrHalr_I1PKdKw 原创 2017-08-27 严祥光(祥光) 阿里巴巴数据库技术 1 概述 AliSQL X-C ...

  9. 基于分布式的短文本命题实体识别之----人名识别(python实现)

    目前对中文分词精度影响最大的主要是两方面:未登录词的识别和歧义切分. 据统计:未登录词中中文姓人名在文本中一般只占2%左右,但这其中高达50%以上的人名会产生切分错误.在所有的分词错误中,与人名有关的 ...

随机推荐

  1. 基于Ionic2的开源项目

    项目介绍 基于Ionic2的Ionic中文论坛客户端,该应用也是边学边做的,为了将更多常用东西加入到APP中,有些逻辑不通之处,敬请包涵. 开源地址 https://github.com/zxj963 ...

  2. android多分辨率多密度下界面适配方案

    前言 Android 设计之初就考虑到了UI在多平台的适配,它本身提供了一套完善的适配机制,随着版本的发展适配也越来越精确,UI适配主要受平台两个因素的影响:屏幕尺寸 (屏幕的像素宽度及像素高度)和屏 ...

  3. 孙鑫MFC学习笔记8:对话框编程(下)

    1.在按钮上没有字体设置,但是在对话框上有字体设置 2.让按钮进行消息响应 *1.创建按钮 *2.创建从按钮继承的类 *3.关联对象 3.属性页编程 *1.在对话框资源中新建属性页 *2.为属性页创建 ...

  4. 使用Monkey进行压力测试

    Android可以使用Monkey向应用发送一连串的随机操作,就好像把手机交给一只猴子让它任意操作一样,以此来检测应用是否健壮,是否容易出错或崩溃.操作的类型包括触屏.移动.按键等. Monkey的语 ...

  5. Centos压缩与打包

    这个虽然是基础知识,但是有些东西就是这样,久了没用,就会忘记,而且之前有一个坏习惯就是不喜欢做笔记,以后学习了行东西一定要记录在博客,这样以后自己也能时不时的查看一下. 言归正传,在计算机的世界中,数 ...

  6. 什么是CGI

    什么是CGI 1. 定义: CGI(Common Gateway Interface)是HTTP服务器与你的或其它机器 上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. 2. 功能: 绝大 ...

  7. TestNG 三 测试方法

    一.设置参数 测试方法是可以带有参数的.每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递正确的参数. 设置方式有两种方法:使用testng.xml或 ...

  8. Linux IO函数的使用和区别

    Linux系统中的IO函数主要有read.write.recv.send.recvmsg.sendmsg.readv.writev,本篇主要介绍他们的使用以及区别. read函数: #include ...

  9. 一款经典的jQuery slidizle 幻灯片

    jQuery广告幻灯片进度条,水平/左右切换,垂直/上下切换,自动播放,缩略图列表切换 在线实例 默认效果 水平/左右切换 垂直/上下切换 循环 自动播放 缩略图 进度条 回调函数 使用方法 < ...

  10. Web 前沿——HTML5 Form Data 对象的使用

    XMLHttpRequest Level 2 添加了一个新的接口——FormData.利用 FormData 对象,我们可以通过 JavaScript 用一些键值对来模拟一系列表单控件,我们还可以使用 ...