模块化之Spring3.0 web fragment和gradle构建项目

时间:2024-05-26 09:03:20

 

1.背景

模块化开发很久以前就开始普及的概念。但是到了企业实际情况中,真正把模块化作为系统架构的核心的不多。或者说对模块化有这个意识,但是具体到底该如何实现,有些模糊,同时也许因为项目紧、任务中、deadline时间段,从而更将模块化抛掷脑后。先要解决生存问题嘛,举个不恰当的例子,饱暖思淫欲。

从2014年底2015年初,我负责的项目就处在了“饱暖思淫欲”的阶段,于是我也开始想开始朝着方面来实现。确实刚开始就遇到了问题,有心杀敌无力回天。

一晃2年过去了,期间换了一家公司,学习了一些新的思想和技术。慢慢的从程序员开始响架构师转变,模块化更是成为了我掌中挚爱,一定要让它开花结果。

程序员们经常谈及架构一次,而架构师似乎也变成了模糊而又神秘的概念。从一个角度来说,架构其实就是组建和组建之间交互而组成。

工欲善其事必先利其器,不管所从事的行业业务多么复杂,技术多么高深,我想一切从简单的做起,一步一步走上开花结果的道路。

2.实现思路

对于系统的真实架构,可以畅谈三天三夜,可以出书可以当作一门课程教学。在此我们假设我们的系统简单到如下图的结构。因为任何架构的终极武器都离不开“分而治之”,从不同角度去“分而治之”,所有说到底经过层层分析,我们还是需要对某一个小模块进行分析实现,即逻辑视图+物理视图分析。

模块化之Spring3.0 web fragment和gradle构建项目

如图所描述的,我们希望最后整个系统的组成不是一个java web项目。而是有一个主项目(master project)和多个子项目(slave project),主项目通过引用子项目构成整个项目。项目中只有代码(包括主项目和子项目),jar包采用dependency的形式,从而避免了传统jar包全在lib中的形式,一个项目被jar包撑的太大太臃肿,而对于jar版本的控制也没办法很好的管理。

如果有一天,我们需要开发一个类似于A功能,但是又不完全一样,不管我们采用何种方式升级、更新A功能,不会影响其他模块,而A功能本身又是很容易替换和更新。

针对上述描述,简单的构建这么一个结构,我选择了spring3.0 web  fragment作为切割模块的核心工具,gradle构建项目,解决jar依赖问题。

3.实现步骤

开发工具:Eclipse4.5.2

gradle版本:Gradle2.14.1

3.1新建主项目(dynamic  web  project)

Eclipse新建dynamic web  project很方便,不做过多描述。

模块化之Spring3.0 web fragment和gradle构建项目

3.2新建第一个子项目(Web Fragment Project【不是gradle项目】)

第一步:选择项目类型

模块化之Spring3.0 web fragment和gradle构建项目

第二步:填写项目名称,注意红框内容,选好依赖的主项目。

模块化之Spring3.0 web fragment和gradle构建项目

第三部完成:点击finish后,项目结构如图:

模块化之Spring3.0 web fragment和gradle构建项目

第四步:编写一个servlet,新建一个包,在该包下编写servlet,如图:

模块化之Spring3.0 web fragment和gradle构建项目

第五步:编写jsp

模块化之Spring3.0 web fragment和gradle构建项目

第六部:编写fragment-web.xml,配置servlet的跳转,

<?xml version="1.0" encoding="UTF-8"?>

<web-fragment id="beforemodule" version="3.0"

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd">

<!-- 指定该Web模块的唯一标识 -->

<name>beforemodule</name>

<welcome-file-list>

<welcome-file>test.jsp</welcome-file>

</welcome-file-list>

<ordering>

<!-- 用于配置该Web模块必须位于哪些模块之前加载 -->

<before>

<!-- 用于指定于其他所有模块之前加载 -->

<others />

</before>

</ordering>

<servlet>

<servlet-name>module3Servlet</servlet-name>

<servlet-class>beforemodule.model3</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>module3Servlet</servlet-name>

<url-pattern>/servlet3/module3</url-pattern>

</servlet-mapping>

</web-fragment>

模块化之Spring3.0 web fragment和gradle构建项目

第七步:缺少依赖的jar可以加一下,如servlet-api.jar

第八步:完整的项目结构如图:

模块化之Spring3.0 web fragment和gradle构建项目

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项目

模块化之Spring3.0 web fragment和gradle构建项目

第二步:修改build.gradle

apply 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内容一样,仅名字有区别。

模块化之Spring3.0 web fragment和gradle构建项目

第四部:refush  gradle project

右键项目,选择gradle,刷新gradle项目。添加jar依赖。

模块化之Spring3.0 web fragment和gradle构建项目

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.说明

以上内容写的比较仓促,在日常工作过程中遇到了些疑问,顾记录下来以作查阅。存在一些描述不足和不详细。