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.2

gradle版本: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的跳转,

<?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>

第七步:缺少依赖的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.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内容一样,仅名字有区别。

第四部: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.说明

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

模块化之Spring3.0 web fragment和gradle构建项目的更多相关文章

  1. 使用Gradle构建项目

    使用gradle构建项目之前,咱们先聊聊maven,使用maven构建项目和配置主要 接下来正式使用gradle来构建项目的和步骤: 1.下载源码 2.下载gradle 1.下载地址:https:// ...

  2. "CreateProcess error=206, 文件名或扩展名太长。",用gradle构建项目创建mapper文件时提示这个错误,是Windows Gradle长类路径问题,官方已经修复

    用gradle构建项目mapper文件时,提示这个错误,这个是Windows Gradle长类路径问题, gradle官方已经解决了这个问题. 官网给出的解决方法地址:https://plugins. ...

  3. vue2.0+webpack+vuerouter+vuex+axios构建项目基础

    前言 本文讲解的是vue2.0+webpack+vuerouter+vuex+axios构建项目基础 步骤 1.全局安装webpack,命令 npm install webpack -g 注意,web ...

  4. 慕课网springboot博客系统开发(一)----spring initializr的使用 gradle构建项目

    spring initializr工具的地址:https://start.spring.io/:通过它可以很方便的创建springboot项目 这里我们选择使用gradle作为项目的构建工具,此spr ...

  5. Android 加速Gradle构建项目

    1. 升级gradle 进入项目文件夹$project/gradle/wrapper/gradle-wrapper.properties, 使用最新的gradle. 修改替换为最新的 distribu ...

  6. gradle构建项目失败:Unzipping /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zip to /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9

    Unzipping /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zip to ...

  7. 在IDEA中用Gradle构建项目时使用lombok以依赖出现出错

    情景: 之情一直是使用Maven构建的项目并且导入依赖后都可以正常使用,但是在换成Gradle时出现了不论使用什么版本的lombok的依赖都会提示@Sl4j注解的log找不到,但是编辑界面是不会报错的 ...

  8. [转] 使用Spring Boot和Gradle创建项目

    Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的 ...

  9. [Gradle] 在 Eclipse 下利用 gradle 构建系统

      转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 构建系统时候常常要用到 Ant, Maven 等工具,对于初学者 ...

随机推荐

  1. 我写的一些前端开源项目(均托管到github)

    大部分项目都是平时项目用到的某些功能,觉得有趣或者复用性有点高就提取成一个单独项目来做维护 coffee-tmpl : 一个极简的模板引擎和ejs及underscore的template类似 turn ...

  2. 基于DDDLite的权限管理OpenAuth.net 1.0版正式发布

    距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心.最近稍微清闲点,正式推出1.0版,并在阿里 ...

  3. TODO:这是一个我的自媒体

    TODO:这是一个我的自媒体 自媒体(外文名:We Media)又称"公民媒体"或"个人媒体",是指私人化.平民化.普泛化.自主化的传播者,以现代化.电子化的手 ...

  4. Android开发学习之路-关于Exception

    Exception在Java中是表示异常的一个类.它是Throwable的子类. 而Exception的子类RuntimeException是一个特殊的异常类,在代码中不需要对此类进行throw,而是 ...

  5. Android开发学习之路-使用annotationProcessor配置Butterknife

    Apt工具的作者宣布了不再维护该工具了,而且Android Studio也有了自己的插件,并且可以通过gradle来简单的配置. 其实用Butterknife的都知道,没有apt,onClick绑定不 ...

  6. Linux Hadoop2.7.3 安装(单机模式) 一

    Linux Hadoop2.7.3 安装(单机模式) 一 Linux Hadoop2.7.3 安装(单机模式) 二 java环境安装 http://www.cnblogs.com/zeze/p/590 ...

  7. form表单 ----在路上(15)

    form 表单就是将用户的信息提交到服务器,服务器会将信息存储活着根据信息查询数据进行增删改查,再将其返回给用户. 基本格式: <form action="" method ...

  8. JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)

    1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法.   2.有时候需要传递大量可选参数的情形时,一 ...

  9. JS中的数学计算<之简单实例讲解>

    1.取余数   % var a=10%3; //a=1 2.取绝对值  Math.abs() var a=Math.abs(-102.1); var b=Math.abs(102.1); //a=10 ...

  10. ASP.NET 访问共享文件夹

    配置代码: var dataProtection = new Microsoft.AspNet.DataProtection.DataProtectionProvider(new DirectoryI ...