复杂的故事简单说,复杂的问题简单做,您好,这里是简露一手,欢迎浏览。
简述
每次:项目发布版本,所有人忐忑不安,出过太多次事故,项目模块大,模块多,模块间紧密关联,哪都会出问题。
一旦:不熟悉项目或新人加入项目或直接是新招的实习生,对于一个还没有稳定的员工和一个不具备掌控整个代码风险把控的员工,是否应该把整个项目SVN发给他?给他,项目安全和风险太大;不给,招来干嘛?怎开发?。
就算:自己运行项目,修改代码时99%的代码与自己无关,下载慢,加载慢,查找慢,编译慢,慢慢慢慢慢。
最后:版本成了心头大患,代码没人敢改,伟大了一堆熬夜测试的人。
分析
耦合性太强,牵一发而动全身。
- 项目模块间关联紧密,修改一个模块影响整个项目。
- 缺少核心模块和业务模块的区分。
- 缺少对核心代码的剥离和保护措施
处理的方式很多,这里就推荐一种简单方式。将代码分成核心包和业务包,建立类库。
处理
从上面分析来看 关键点在于拆,其实隐藏的还有一个合。需产出一种效果:代码开发时只需要拆分出来的一小部分代码,而在应用调试和启动运行的则是一个所有代码编译后的合集。简单点就是一拆一合,分两个步骤:拆、合。
拆
拆是指把整个项目按照一定的思维逻辑进行核心和业务拆分。这个一定的思维逻辑是说符合项目本身架构核心和业务核心,我们这里先用包来称呼,后面好表述。最上层分为:核心包、业务包。核心包以外的部分作为业务包,核心包为一个或极少的几包;而业务包是无限扩展的很多个包,如:新增一个日志查询模块,则建立日志业务包。这个业务包和核心包中间的关系,重点:业务包依赖于核心包,而核心包不依赖于任何业务包。到这里都是一个概念的表述,实际以Eclipse为例操作分三个步骤来做:建子项目、迁移代码、解耦调整。
为方便讲解,这里先创建了一个简单的项目:georgekaren,主要业务是客户端ClientSoap调用Server查询Adsl、Cdma、User三个业务的业务信息,项目模块:
建子项目
项目framework、db、util和server包的server对象放到核心包,业务包根据功能和业务逻辑拆分后包括:client包、cron包、log包、server包[分成Adsl业务扩展包、Cdma业务扩展包、User业务扩展包]、webservice包。针对每一个包建立一个子项目[如果业务包有Web依赖,则创建Web项目],如下。
这里不要嫌创建的项目多而觉得繁杂,创建项目时间比较短,合包后很方便。
迁移代码
项目建立好之后就开始将原始项目中的代码复制到新建的项目中去,迁移过去的代码或多或少会由于依赖关系会有编译报错,留给后面步骤去处理。
解耦调整
代码迁移完成后,需要做的就是修正编译错误。主要有两个手段,其一是给项目添加依赖引用,业务包除了对core的依赖尽量减少对其它包的依赖,可以适量修改代码来完成;其二是调整core对所有业务包的依赖,使核心包不依赖业务包,并且不影响Client调用Server的业务。
- 项目添加引用,属性设置Java Build Path。
- 调整core 的引用,采用loadClass方式来替代直接new 业务Server
实际生产用的时候大部分使用的工厂,这里就不去创建一个工厂了,直接贴loadClass,表述的原理一样。
原
新
这样改造后core核心包的编译不依赖Server业务包,通常有数据库的情况下,将serverName和MethonName存到数据库表中,由程序根据type自动从数据库中查询,这样的处理有个词叫插件;当一个客户请求需要先查询Adsl业务再加上Cdma或先查询User再查询Adsl场景时只需要更改数据库配置的插件和插件的顺序,就可以组成不同的业务场景,这在流程配置上,尤其有效。
合
合是指把整个项目拆分后在单独开发或运行的时候怎么得到其它业务包的编译文件,这个是一个合的过程。这里介绍的处理方式是:类库,打包。
建类库
建类库是指建设一个存放公共jar或其它公共文件的地方,可以是个文件夹,可以是个项目,这里我们建立一个项目,并建立一个文件夹publib,将用于存放所有的包。
打包
打包时将所有核心、业务包编译成class并打成jar包。这里使用Eclipse自带的ant自动打包。操作:
-
业务包项目上右键--属性--Export(导出)--Ant
生成ant的build.xml文件,修改build.xml的两处地方,1.第一行的default="build" 修改为 default="package";2.path 下面增加target来配置导出jar的路径。
按照此方式将所有的业务包项目都配置ant,配置完成后再Build.xml上右键Run执行,jar就自动导出到类库的publib下了。
到这里类库就已经有了所有jar,所有的包全部合到了类库中。
效果
回头看下最初的问题:
- 发版本问题,只需要关注有业务改动的jar,没有那么多动荡,回退也相当的方便,替换修改的jar就完成了回退。
- 新人安全问题,如让新人修改adsl业务的一个需求,只给予Adsl项目权限和pub项目的权限就OK了,核心代码和其它模块都是安全的。
- 代码多,加载慢问题,修改cdma则只下载cdma代码,业务包的代码量极少,慢问题迎刃而解。
总结
拆分是手段,类库打包是方法;原则是少代码,多包,非核心少依赖。做成功了可以任意配置需要使用的业务包,按照不同数量和不同的顺序串起来可以产生无限种业务功能。
<small>作为商业项目,完成后还需要一步,对核心代码或关键业务包进行保密处理,而简单又有效的方式就是混淆,如有意,请留言,根据情况找时间再补上混淆保密的文章</small>