「干货分享」模块化编程和maven配置实践一则
封面
说到模块化编程,对我个人而言首先起因于团队协作的需要,也就是组织架构结构特点来决定,而不是跟风求得自我认同,看看我们团队的组织结构:
其中:
基础平台部职责:
1、AI实验室:语音,图像识别算法持续优化;垂直领域不同业务场景下持续提高算法精准度指标;产出通用算法基础服务组件,为基础平台做支持。
2、基础平台组:所有非业务相关的组件的开发:如:缓存,消息,传输,数据库交互,虚拟化等通用组件;非业务相关系统的开发,如:运维平台,交换平台,门户平台,统一用户门台,监控平台等;集成深度学习实验室基础服务组件。最终产出通用基础平台,为产品和项目开发提供基础服务支撑。
3、产品和项目上线及日常运维,基于已有运维平台为产品部和项目部提供产品上线支撑以及日常运维工作。
该部门下设:部门经理,AI研发经理,基础平台经理
产品开发部职责:
根据产品部门的规划设计,开发可复用的行业产品,负责多个产品线的开发和迭代。
该部门下设:部门经理,产品开发经理。
项目开发部职责:
负责项目类软件的全周期实施管理,项目集成中的软件部分以及产品的二次开发。
该部门下设:部门经理(类似于PMO),项目经理,开发经理。
其他两个部门和本次内容无关,简单介绍如下:
产品部负责部分售前工作,产品规划,产品设计,产品管理,专利和著作权相关工作。
QA负责软件测试和质量管理。
~回归正题~
由于组织结构的特点,要求软件开发必须组件化,特别是基础平台部,各个组件都是可以单独应用到产品和项目软件中,就想手机是一个产品,里面的元器件如cpu,内存,相机都是可插拔的。
那么maven的模块化配置就非常有用了(在没使用maven之前,采用的是eclipse打包之后,cmd命令install组件化jar文件到仓库的方式)。
maven的模块化网上已经很多了,无外乎一个parent,一堆子项目。然后parent配置的依赖和插件都可以在子项目中用。这里对模块化的配置就不详说了。
这里讲一个模块化的细节场景:
场景:基础平台中某些包含界面视图(如jsp,vm等)的通用化功能单元,要求可作为jar供其他项目或产品直接在代码中调用,而不是用的时候将jsp复制到项目中或者独部署基础平台通过服务的方式调用。同时又要求可打包成war在基础平台开发中调试。
那么就要求在基础平台打包的过程中能同时打成war和jar包,并且jar中包含所有界面视图文件。
对jar包中静态资源(jsp,js,png,tld等)的访问,利用了meta-info这个文件夹的特性。
有人说这个特性是server3.0的特性,应该不是(具体是什么时候支持的,自己可查阅),早期的struts和spring都已经使用这个特性了,只不过放的是tld文件(自定义标签)。
meta-info对于jar来说是用来描述与该应用相关的各类元数据的地方,比如里面的MANIFEST.MF,通常用来描述启动参数:如main方法所在类,依赖包等。还比如servlet3.0中模块化的描述文件web-fragment.xml等。
我们通常将静态文件如:jsp放在webapp/WEB-INF下,那么对于jar,它的根目录/META-INF/resources/WEB-INF就如同webapp/WEB-INF,只不过不用于加载web.xml等文件。那么打包的时候只要将webapp/WEB-INF下的目录拷贝到src/main/resources下即可(此目录下的所有文件都会打包到jar包的跟目录,也就是classpath下)。
示例
这里通过一个例子来说明如何将基础平台打包成war的同时连同jsp打包成jar,最后供项目开发调用的具体过程。
开发环境:
eclispe Oxygen Release (4.7.0);
maven 3.2.2
项目结构:
其中core-web是基础平台(Core)的一部分,主要是通用的含有界面的模块化组件,我们计划将其打包成jar并在busuness-prj项目直接调用。
其他几个项目类似这里不做配置讲解,可下载代码后查看,这里只讲解core-web。
一下是core-web的程序结构,包含了一个通用模块,这里假设为a模块,通过spring mvc来实现,具体的spring的配置下载后看代码,这里篇幅问题就不写了,项目结构如下:
为了测试,模块A的界面就简单设计一下,如打印一下当前时间。
主要用到了以下maven插件:
maven-antrun-plugin;打包前文件拷贝;
maven-jar-plugin;打jar包;
maven-war-plugin;打war包。
jetty-maven-plugin;jetty运行(非必须,可以将打好的war放在tomcat等容器中运行,这里只是图个方便);
关于这几个插件的详细配置,这里只用了基本配置,不做详细说明,网上应该有很多文章了。
具体maven配置如下:
运行maven:clean package,在eclipse中配置这个命令即可,如下:
打完包后,target中会同时出现jar和war包,如下:
其中jar的结构如下,成功的将web-inf下的文件打包进了jar文件:
接下来运行maven:install,将jar文件install到仓库里(项目右键run as ->maven install即可)。
接下来只要在business-prj中配置对此core-web的jar依赖即可,具体配置如下:
运行jetty,同样在eclipse中配置jetty启动,如下:
启动之后,地址栏输入:localhost:8080/a/list.do。即可直接在项目中使用基础平台的组件了,当然business-prj也需要配置SpringMvc的支撑(web.xml等文件中要添加具体配置,具体配置下载项目查看)。
~以上就是本次分享的全部内容~
maven的配置中大家有遇到很多问题,可一起讨论。
以上示例基本实现了基础平台部门与产品及项目开发部门的协同开发,当然协同开发还有很多方面,比如git的协同,沟通的协同等很多方面,后面有时间会陆续分享。
已分享的相关文章推荐阅读:
项目协作管理平台-teambition和tapd--深度体验
项目原件下载
为防止地址失效,所有下载链接都在公众号维护,请关注公众号后,回复“R001” 获取本次分享的项目。

「干货分享」模块化编程和maven配置实践一则的更多相关文章
- 【腾讯Bugly干货分享】微信热补丁Tinker的实践演进之路
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ad7a70eaed47bb2699e68e Dev Club 是一个交流移动 ...
- 「资料分享」理解uboot要看哪些书
最开始是看的韦东山老师的视频,确实很不错,不过总感觉是不够深入扎实,还是想自己看看书,就总结搜罗下,以供参考 学习交流可以添加 微信读者交流①群 (添加微信:coderAllen) 程序员技术交流①群 ...
- Javascript模块化编程(一):模块的写法
Javascript模块化编程(一):模块的写法 作者: 阮一峰 原文链接:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html ...
- Javascript模块化编程(一):模块的写法(转)
随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者 ...
- js 模块化编程
Javascript模块化编程(一):模块的写法 作者: 阮一峰 日期: 2012年10月26日 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞 ...
- Javascript模块化编程(一):模块的写法 作者: 阮一峰
声明:转载自阮一峰的网络日志 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理. ...
- Javascript模块化编程之路——(require.js)
转自:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html Javascript模块化编程(一):模块的写法 随着网站逐渐变成&q ...
- Javascript模块化编程(一):模块的写法 (转载 学习中。。。。)
转载地址:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 阮一峰 大神:http://www.ruanyifeng.com/ ...
- Javascript模块化编程(一):模块的写法【转】
作者: 阮一峰 日期: 2012年10月26日 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分 ...
随机推荐
- 枚举类型的使用方法enum
一.枚举类型的使用方法 一般的定义方式如下: enum enum_type_name { ENUM_CONST_1, ENUM_CONST_2, ... ENUM_CONST_n } enum_var ...
- HDU-6035:Colorful Tree(虚树+DP)
这里有三道长得像的题: 一:HDU6036: There is a tree with nn nodes, each of which has a type of color represented ...
- openjudge 4116:拯救行动
传送门 总时间限制: 1000ms 内存限制: 65536kB 描述 公主被恶人抓走,被关押在牢房的某个地方.牢房用N*M (N, M <= 200)的矩阵来表示.矩阵中的每项可以代表道路( ...
- 程序设计中的计算复用(Computational Reuse)
从斐波那契数列说起 我想几乎每一个程序员对斐波那契(Fibonacci)数列都不会陌生,在很多教科书或文章中涉及到递归或计算复杂性的地方都会将计算斐波那契数列的程序作为经典示例.如果现在让你以最快的速 ...
- 规划ASM DISK GROUP、查看asm 磁盘当前状态、mount or dismount 磁盘组、检查磁盘组 metadata 的内部一致性
规划ASM DISK GROUP: 1. 每个磁盘组里的磁盘应该大小.性能.新旧等一致,不能有太大差距 2. 对database files 和 fast recovery area 分别创建不同的d ...
- 洛谷 P4336 黑暗前的幻想乡 —— 容斥+矩阵树定理
题目:https://www.luogu.org/problemnew/show/P4336 当作考试题了,然而没想出来,呵呵. 其实不是二分图完美匹配方案数,而是矩阵树定理+容斥... 就是先放上所 ...
- ReSIProcate源码目录下功能说明
1.basicCall,basicMessage,basicRegister,resip_test测试用的 2.db_static Sleepy Cat开发的Berkeley DB 3.dum为Dia ...
- 微软 codeplex 团队
http://www.codeplex.com/site/users/view/Microsoft
- string行读入&&文件输入
普通读入的时候会以空格作为分隔符 直接用cin>>s读入,此时可以直接处理文件尾的情况 text代码: #include <iostream>#include <cstd ...
- mui 关闭当前窗口
在提交表单的时候,我们都需要关闭表单.需要关闭当前打开的窗口. bit.alert('提交成功' + (result.category.needAudit ? ",请耐心等待管理员审核信息后 ...