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. Lesson 23 A new house

    Text I had a letter from my sister yesterday. She lives in Nigeria. In her letter, she said that she ...

  2. Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值

    第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...

  3. Atitit 多元化战略 适合我们发展 的核心业务attilax总结

    Atitit 多元化战略 适合我们发展 的核心业务attilax总结 1.1. 历史的大趋势,全球范围内人员的大流动1 1.2. 衣食住行1 1.3. 农村包围城市战略1 1.4. 挪开三座大山(住房 ...

  4. JavaScript随笔6

    Ajax:(1) 阻止缓存?+t = new data(); eval可以把string变为数组(2) get:放入URL username = &password = ; 容量有小 安全性差 ...

  5. CSS3与页面布局学习总结(七)——前端预处理技术(Less、Sass、CoffeeScript、TypeScript)

    CSS不像其它高级语言一样支持算术运算.变量.流程控制与面向对象特性,所以CSS样式较多时会引起一些问题,如修改复杂,冗余,某些别的语言很简单的功能实现不了等.而javascript则是一种半面向对象 ...

  6. 原生JS实现"旋转木马"效果的图片轮播插件

    一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...

  7. JS去重及字符串奇数位小写转大写

    面试中经常会考到数组的去重.作为一名合格的前端开发者,不知道几种去重方法是在不应该.废话不多说直接开撸-- 一.indexOf()方法 实现思路:使用indexOf()方法来判断新数组中是否有这个值, ...

  8. Basic Tutorials of Redis(4) -Set

    This post will introduce you to some usages of Set in Redis.The Set is a unordered set,it means that ...

  9. .NET 实现并行的几种方式(一)

    好久没有更新了,今天来一篇,算是<同步与异步>系列的开篇吧,加油,坚持下去(PS:越来越懒了). 一.Thread 利用Thread 可以直接创建和控制线程,在我的认知里它是最古老的技术了 ...

  10. C# - 计时器Timer

    System.Timers.Timer 服务器计时器,允许指定在应用程序中引发事件的重复时间间隔. using System.Timers: // 在应用程序中生成定期事件 public class ...