「干货分享」模块化编程和maven配置实践一则

封面html

说到模块化编程,对我我的而言首先原由于团队协做的须要,也就是组织架构结构特色来决定,而不是跟风求得自我认同,看看咱们团队的组织结构:git

 

其中:web

基础平台部职责:算法

一、AI实验室:语音,图像识别算法持续优化;垂直领域不一样业务场景下持续提升算法精准度指标;产出通用算法基础服务组件,为基础平台作支持。spring

二、基础平台组:全部非业务相关的组件的开发:如:缓存,消息,传输,数据库交互,虚拟化等通用组件;非业务相关系统的开发,如:运维平台,交换平台,门户平台,统一用户门台,监控平台等;集成深度学习实验室基础服务组件。最终产出通用基础平台,为产品和项目开发提供基础服务支撑。数据库

三、产品和项目上线及平常运维,基于已有运维平台为产品部和项目部提供产品上线支撑以及平常运维工做。编程

该部门下设:部门经理,AI研发经理,基础平台经理缓存

产品开发部职责:tomcat

根据产品部门的规划设计,开发可复用的行业产品,负责多个产品线的开发和迭代。架构

该部门下设:部门经理,产品开发经理。

项目开发部职责:

负责项目类软件的全周期实施管理,项目集成中的软件部分以及产品的二次开发。

该部门下设:部门经理(相似于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的协同,沟通的协同等不少方面,后面有时间会陆续分享。

已分享的相关文章推荐阅读:

大话团队的GIT分支策略进化史

项目协做管理平台-teambition和tapd--深度体验

项目原件下载

为防止地址失效,全部下载连接都在公众号维护,请关注公众号后,回复“R001” 获取本次分享的项目。

相关文章
相关标签/搜索