模块化之Spring3.0 web fragment和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.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构建项目的更多相关文章
- 使用Gradle构建项目
使用gradle构建项目之前,咱们先聊聊maven,使用maven构建项目和配置主要 接下来正式使用gradle来构建项目的和步骤: 1.下载源码 2.下载gradle 1.下载地址:https:// ...
- "CreateProcess error=206, 文件名或扩展名太长。",用gradle构建项目创建mapper文件时提示这个错误,是Windows Gradle长类路径问题,官方已经修复
用gradle构建项目mapper文件时,提示这个错误,这个是Windows Gradle长类路径问题, gradle官方已经解决了这个问题. 官网给出的解决方法地址:https://plugins. ...
- vue2.0+webpack+vuerouter+vuex+axios构建项目基础
前言 本文讲解的是vue2.0+webpack+vuerouter+vuex+axios构建项目基础 步骤 1.全局安装webpack,命令 npm install webpack -g 注意,web ...
- 慕课网springboot博客系统开发(一)----spring initializr的使用 gradle构建项目
spring initializr工具的地址:https://start.spring.io/:通过它可以很方便的创建springboot项目 这里我们选择使用gradle作为项目的构建工具,此spr ...
- Android 加速Gradle构建项目
1. 升级gradle 进入项目文件夹$project/gradle/wrapper/gradle-wrapper.properties, 使用最新的gradle. 修改替换为最新的 distribu ...
- 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 ...
- 在IDEA中用Gradle构建项目时使用lombok以依赖出现出错
情景: 之情一直是使用Maven构建的项目并且导入依赖后都可以正常使用,但是在换成Gradle时出现了不论使用什么版本的lombok的依赖都会提示@Sl4j注解的log找不到,但是编辑界面是不会报错的 ...
- [转] 使用Spring Boot和Gradle创建项目
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的 ...
- [Gradle] 在 Eclipse 下利用 gradle 构建系统
转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 构建系统时候常常要用到 Ant, Maven 等工具,对于初学者 ...
随机推荐
- AngularJS 第三天----作用域
作用域的概念及其功能 AngularJS使用作用域的概念来充当数据模型的作用,在视图和控制器之间起着桥梁的作用.由于双向绑定的数据特性,视图的修改会更新 $scope,同样对 $scope的修改也会重 ...
- 配置文件Java读写
今天把配置文件的Bug修复了,总结一下Java配置文件如何读写 配置文件的格式 以.properties后缀结尾,内容不出现空格和双引号 //config.properties Driver=com. ...
- 关于js中的this之判断this
this绑定规则的优先级顺序 new操作符绑定 > 显示绑定 > 隐式绑定 > 默认绑定 所以在判断函数在某个调用位置应用的是哪条规则,可以按下列这样的顺序 if(函数在ne ...
- 阿里云accessKey如何创建?~ 2015.08.25
选择导航条上面的ACCESSKeys(工单服务左边,我一开始也没注意到) 创建一下,然后同意 验证一下 收工
- Bootstrap3系列:下拉菜单
1.引用Bootstrap 示例引用的Bootstrap版本:v3.3.7 <script src="~/Scripts/jquery-2.2.4.min.js">&l ...
- AutoMapper对internal访问级别属性的映射
最近在使用DDD重新搭建公司内部OA的架构,具体情况搭好了应该会写一下,这里说的是今天遇到的问题. 先简单说一下相关的几个部分: 1.聚合.聚合分成了两个模块:一个包含审批单据等估计至少今年不会怎么变 ...
- System.arraycopy()和Arrays.copyOf()的区别
先看看System.arraycopy()的声明: public static native void arraycopy(Object src,int srcPos, Object dest, in ...
- 前端开发工具vue.js开发实践总结
最近有很长时间没有更新博客了,换了公司,全部的心思都放在项目上了.通过这次项目的上线,让我感受最深的是前后端分离后,前端页面的模块化管理,以及前端页面的数据邦定.在接触vue.js之前,我之前端要用到 ...
- Laravel学习--关于Relation的坑
前段时间比较忙,就没有坚持写博客,但发现这周末再想捡起来,好难,一直到了今天晚上,才决定坐下来写一篇,哈哈哈-- 最近在用 Laravel 5.2,踩了几个关于 Relation 的坑,在这里用博客记 ...
- 跨域之同源策略 Same-origin policy
同源策略是浏览器中最基本的隔离潜在恶意文件的安全策略,他限制了来自不同源(origin)的文档或脚本之间的相互作用. 何谓同源 在跨域之URL中介绍过一个URL的标准格式如下: 协议类型://服务器地 ...