模块化之Spring3.0webfragment和gradle构建项⽬
1.背景
模块化开发很久以前就开始普及的概念。但是到了企业实际情况中,真正把模块化作为系统架构的核⼼的不多。或者说对模块化有这个意识,但是具体到底该如何实现,有些模糊,同时也许因为项⽬紧、任务中、deadline时间段,从⽽更将模块化抛掷脑后。先要解决⽣存问题嘛,举个不恰当的例⼦,饱暖思淫欲。
从2014年底2015年初,我负责的项⽬就处在了“饱暖思淫欲”的阶段,于是我也开始想开始朝着⽅⾯来实现。确实刚开始就遇到了问题,有⼼杀敌⽆⼒回天。⼀晃2年过去了,期间换了⼀家公司,学习了⼀些新的思想和技术。慢慢的从程序员开始响架构师转变,模块化更是成为了我掌中挚爱,⼀定要让它开花结果。程序员们经常谈及架构⼀次,⽽架构师似乎也变成了模糊⽽⼜神秘的概念。从⼀个⾓度来说,架构其实就是组建和组建之间交互⽽组成。⼯欲善其事必先利其器,不管所从事的⾏业业务多么复杂,技术多么⾼深,我想⼀切从简单的做起,⼀步⼀步⾛上开花结果的道路。
2.实现思路
对于系统的真实架构,可以畅谈三天三夜,可以出书可以当作⼀门课程教学。在此我们假设我们的系统简单到如下图的结构。因为任何架构的终极武器都离不开“分⽽治之”,从不同⾓度去“分⽽治之”,所有说到底经过层层分析,我们还是需要对某⼀个⼩模块进⾏分析实现,即逻辑视图+物理视图分析。
如图所描述的,我们希望最后整个系统的组成不是⼀个java web项⽬。⽽是有⼀个主项⽬(master project)和多个⼦项⽬(slave project),主项⽬通过引⽤⼦项⽬构成整个项⽬。项⽬中只有代码(包括主项⽬和⼦项⽬),jar包采⽤dependency的形式,从⽽避免了传统jar包全在lib中的形式,⼀个项⽬被jar包撑的太⼤太臃肿,⽽对于jar版本的控制也没办法很好的管理。
如果有⼀天,我们需要开发⼀个类似于A功能,但是⼜不完全⼀样,不管我们采⽤何种⽅式升级、更新A功能,不会影响其他模块,⽽A功能本⾝⼜是很容易替换和更新。针对上述描述,简单的构建这么⼀个结构,我选择了spring3.0 web fragment作为切割模块的核⼼⼯具,gradle构建项⽬,解决jar依赖问题。
3.实现步骤
开发⼯具:Eclipse4.5.2gradle版本:Gradle2.14.1
3.1新建主项⽬(dynamic web project)
Eclipse新建dynamic web project很⽅便,不做过多描述。
3.2新建第⼀个⼦项⽬(Web Fragment Project【不是gradle项⽬】)
第⼀步:选择项⽬类型
第⼆步:填写项⽬名称,注意红框内容,选好依赖的主项⽬。
第三部完成:点击finish后,项⽬结构如图:
第四步:编写⼀个servlet,新建⼀个包,在该包下编写servlet,如图:
第五步:编写jsp
第六部:编写fragment-web.xml,配置servlet的跳转,xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"beforemoduletest.jsp
module3Servletbeforemodule.model3
module3Servlet/servlet3/module3
第七步:缺少依赖的jar可以加⼀下,如servlet-api.jar第⼋步:完整的项⽬结构如图:
3.3新建第⼆个⼦项⽬(Web Fragment Project【不是gradle项⽬】)
过程和3.2过程⼀样,唯⼀不同的是,⽤Eclipse⾃动⽣成的fragment-web.xml中,带有display-name标签,要去掉该标签。因为当主项⽬同时引⽤2个fragment项⽬时,项⽬会系统⽣成display-name,若配置⽂件⾥有这个标签,tomcat启动会报错。
3.4新建第⼆个⼦项⽬(Web Fragment Project【不是gradle项⽬】)3.5新建第⼀个gradle⼦项⽬(NEW GRADLE PROJECT)
第⼀步:新建gradle项⽬
第⼆步:修改build.gradleapply plugin: 'java'apply plugin: 'eclipse'
repositories { mavenLocal() mavenCentral()}
dependencies { //Servlet
compile \"javax.servlet:jstl:1.2\"
compile 'javax.servlet:servlet-api:2.5' // 编译期}
第三部:项⽬结构如图,类和jsp内容同3.2内容⼀样,仅名字有区别。
第四部:refush gradle project
右键项⽬,选择gradle,刷新gradle项⽬。添加jar依赖。
3.6新建fragmentproject,convert to gradle⼦项⽬
配置⽂件如3.5build.gradle内容。
3.7将主项⽬关联4个⼦项⽬即可。
4.遇到的问题及解决
4.1 fragment和gradle如何在⼀个项⽬存?
解决以下两个问题:
1.新建gradle项⽬,通过proejct facets设置web fragment project。2.新建web fragment project,convert to gradle project。
4.2 通过Depolyment Assembly引⽤多个项⽬时报
错,The display name was defined in multiple fragments with different values including fragment with name [XXX]⼀个项⽬时不抱错?
在Eclipse创建⼯程的时都⾃动⽣成了display这个标签,但每个web-fragment.xml中的东西⼜都会被统⼀解析,因此导致display元素定义重复了。
5.说明
以上内容写的⽐较仓促,在⽇常⼯作过程中遇到了些疑问,顾记录下来以作查阅。存在⼀些描述不⾜和不详细。