框架模块化开发规范.docx
《框架模块化开发规范.docx》由会员分享,可在线阅读,更多相关《框架模块化开发规范.docx(13页珍藏版)》请在冰豆网上搜索。
框架模块化开发规范
框架模块化开发规范
2015年8月
更新历史
编写人
日期
版本号
变更内容
萧海生
2015-08-31
0.01
初次编写
1.前言4
1.1模块化要做什么?
4
1.2模块化的技术支持4
2.模块化项目目录结构8
2.1目录结构结构说明9
3.MAINFEST.MF文件配置10
4.pom.xml文件配置11
5.依赖与引用12
6.参数配置12
7.数据库检查13
8.核心模块13
8.1核心模块作用13
8.2启动检查14
8.3工具类14
8.4日志支持14
9.附录15
9.1MANIFEST.MF文件编辑问题15
1.前言
1.1模块化要做什么?
模块化的目标是将WEB应用的所有内容打到一个jar包中(包括类文件、页面文件、JS文件、CSS文件以及配置文件等)。
每个模块都以一个jar包的形式存在,这样模块的粒度就可以随意掌握,以利于框架的管理和版本升级。
1.2模块化的技术支持
1.2.1Servlet3.0模块化支持
Servlet从3.0开始支持各Web应用的模块化,也就是说从Servlet3.0开始,我们可以把各Web应用单独拿出来进行开发,之后把它们打成对应的jar包放到主项目中就可以了。
(包括各种资源文件以及web.xml的配置都可以打包到jar中)
Web模块打成的jar包的内容的文件结构要求是这个样子的:
|--META-INF
| |--web-fragment.xml
| |--resources
| | |--jsp、图片等,相当于web的根目录
|--class文件和类路径下的文件
其中web-fragment.xml文件是必须要的。
上述目录结构就相当于在我们的类路径下有一个META-INF目录,该目录下有web-fragment.xml文件及包含jsp、图片等资源的resources目录。
1.2.1.1web-fragment.xml
web-fragment.xml文件的作用与Web应用下的web.xml文件的作用是相似的,在web.xml文件可以配置的信息都可以在web-fragment.xml文件中进行配置。
此外,它们的文档结构也非常的相似。
所不同的是web-fragment.xml文件的根元素是web-fragment,所使用的schema也是web-fragment相应的schema,配置如下:
1.2. xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
3. xsi:
schemaLocation="
4.
5.
在web-fragment.xml文件中我们可以通过元素来指定当前模块的名称,用元素来指定当前模块相对的加载顺序。
元素下面可以指定或元素,而和元素下又可以指定和元素。
指定ordering的示例如下。
Ø在其他模块之前加载
1.
2.
-- 在其它模块之前加载 -->
3.
4.
5.
6.
Ø在指定模块之后加载
1.
2.
-- 在指定模块之后加载 -->
3.
4. 模块名称
5.
6.
除了可以在web-fragment.xml文件里面通过元素定义当前模块的加载顺序外,我们还可以在web.xml文件中通过元素指定各模块的加载顺序。
而且web.xml文件中指定的加载顺序比web-fragment.xml文件中指定的加载顺序具有更高的优先级。
如:
1.
2. module1
3. module2
4. module3
5.
6.
更多内容请参考Servlet3.0规范。
1.2.1.2模块化示例
接下来我们来展示一个创建web模块的例子。
假设我们要创建一个叫做module1的模块,其中含有一个Module1Servlet,其代码如下所示:
1.public class Module1Servlet extends HttpServlet {
2.
3. private static final long serialVersionUID = 1L;
4.
5. @Override
6. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
7. throws ServletException, IOException {
8. this.doPost(req, resp);
9. }
10.
11. @Override
12. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
13. throws ServletException, IOException {
14. req.getRequestDispatcher("/module1.jsp").forward(req, resp);
15. }
16.
17.}
接着我们在类路径下创建一个META-INF文件夹,在该文件夹下创建一个resources目录,在resources目录下创建一个module1.jsp文件。
接着在META-INF目录下创建一个web-fragment.xml文件,其内容如下:
1.2. xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
3. xsi:
schemaLocation="
4.
5.
-- 指定模块名称 -->
6. module1
7.
-- 加载顺序 -->
8.
9.
-- 在其它模块之前加载 -->
10.
11.
12.
13.
14.
15.
16. module1Servlet
17. com.xxx.Module1Servlet
18.
19.
20.
21. module1Servlet
22. /servlet/module1
23.
24.
25.
之后我们把该项目打成一个jar包就可以把它作为一个jar加到其它Web应用中,在其它Web应用中使用了。
放到其它Web应用中后,我们通过访问/servlet/module1就可以访问到我们module1模块中定义的Module1Servlet了。
module1模块的目录结构如下:
1.2.2Maven
Maven是个优秀的项目管理及构建工具。
由于模块化开发的最终产出物为jar包,使用maven进行项目管理可以很方便的将项目打包成jar包。
在进行模块化开发的时候模块间的依赖关系是非常复杂的,而maven的项目依赖管理功能是非常强大的,可以很好的帮助我们管理模块间的依赖关系。
综合以上原因,在进行模块化开发时采用maven作为项目管理工具。
2.运行环境要求
软件
版本
说明
操作系统
Windows/linux
Jdk
>=1.6
应用服务器
Tomcat
>=7.0
支持Servlet3.0规范的应用服务器。
Weblogic
>=12c
3.模块化项目目录结构
模块化开发采用maven作为项目管理工具,模块化项目必须遵循如下目录结构。
目录
说明
|
/
项目根目录
|--pom.xml
/pom.xml
Maven配置文件
|--src
/src
||--main
/main
项目主体根目录
|||--java
/src/main/java
源代码目录
|||--resources
/src/main/resources
所需资源目录
||||--config
/src/main/resources/config
配置文件根目录
||||--spring
/src/main/resources/spring
Spring配置文件根目录
||||--META-INF
/src/main/resources/META-INF
MANIFEST.MF、web-fragment.xml
|||||--resources
/src/main/resources/META-INF/resources
相当于Web应用目录,存放jsp、css、图片、js等资源文件
||--test
/src/test
项目测试根目录
|||--java
/src/test/java
测试代码目录
|||--resources
/src/test/resources
测试资源所需目录
|--target
/target
项目输出根目录
目录结构如下图所示:
3.1目录结构结构说明
3.1.1/src/main/java
该目录为java源代码目录。
模块的java包路径必须以模块简称开头。
如demo模块类的包路径为:
com.hnisi.demo.***
3.1.2/src/main/resources/config
该目录为配置文件目录。
为了防止模块间配置文件的冲突,配置文件必须存放在该目录下对应模块的目录内。
如demo模块的配置文件存放路径为:
/src/main/resources/config/demo
3.1.3/src/main/resources/spring
该目录为spring配置文件目录。
为了防止模块间文件的冲突,配置文件必须存放在该目录下对应模块的目录内。
如demo模块的spring配置文件存放路径为:
/src/main/resources/spring/demo
3.1.4/src/main/resources/META-INF/resources
根据Servlet3.0规范,该文件夹相当于web应用的根目录。
主要用于存放web应用资源,如jsp、html、css、js、image等资源文件。
4.MAINFEST.MF文件配置
MANIFEST.MF文件位于/src/main/resources/META-INF目录下。
打包成jar模块包时该文件位于jar包的META-INF目录下。
该文件为jar包的描述文件。
为了区别普通jar包与模块化jar包的区别,需要在MANIFEST.MF文件中加入如下配置信息,其中红色部分的属性是必须的(MANIFEST.MF文件的编辑问题请参考附录9.1章节)。
Manifest-Version:
1.0
Bundle-Type:
模块类型,必须为:
Hnisi
Bundle-Name:
模块名,与pom.xml中的artifactId一致
Bundle-Version:
模块版本号,与pom.xml中的version一致
Bundle-Description:
模块描述
Bundle-Version-Compatible:
模块兼容的最低版本号
Require-Bundle:
依赖的模块,写法为:
模块1;模块1版本号,模块2;模块2版本号
Require-Table:
S_USER,S_FRAMEWORK_MENU
Require-View:
V_TODO_LIST
例子:
Manifest-Version:
1.0
Bundle-Type:
Hnisi
Bundle-Name:
Hnisi-Fw-Demo
Bundle-Version:
1.0.0.0
Bundle-Description:
测试模块
Bundle-Version-Compatible:
0.0.0.1
Require-Bundle:
Hnisi-Fw-Code;1.0.0.0,Hnisi-Fw-Dao;1.0.0.0
Require-Table:
S_USER,S_FRAMEWORK_MENU
Require-View:
V_TODO_LIST
5.pom.xml文件配置
pom.xml文件为maven配置文件,具体配置可参考maven相关文档。
为了将MANIFEST.MF文件打包进jar包中,需要在pom.xml文件中加入如下配置。
org.apache.maven.plugins
maven-jar-plugin
2.6
false
src\main\resources\META-INF\MANIFEST.MF
6.依赖与引用
一个模块除了包含java类之外同时还包含了各种接口、springbean、service服务以及页面文件、JS文件、CSS文件、图片文件等。
由此可见模块间的依赖是非常复杂的,除了最常见的java类依赖外还包含了接口、服务、资源文件等之间的相互依赖。
这里我们只对模块间的依赖关系进行管理,开发过程中通过maven进行依赖管理。
运行过程中通过MANIFEST.MF文件的Require-Bundle配置属性进行定义,然后由核心模块进行启动时检查。
配置如下。
Manifest-Version:
1.0
Bundle-Type:
模块类型,必须为:
Hnisi
Bundle-Name:
模块名,与pom.xml中的artifactId一致
Bundle-Version:
模块版本号,与pom.xml中的version一致
Bundle-Description:
模块描述
Bundle-Version-Compatible:
模块兼容的最低版本号
Require-Bundle:
依赖的模块,写法为:
模块1;模块1版本号,模块2;模块2版本号
Require-Table:
S_USER,S_FRAMEWORK_MENU
Require-View:
V_TODO_LIST
例:
Manifest-Version:
1.0
Bundle-Type:
Hnisi
Bundle-Name:
Hnisi-Fw-Demo
Bundle-Version:
1.0.0.0
Bundle-Description:
测试模块
Bundle-Version-Compatible:
0.0.0.1
Require-Bundle:
Hnisi-Fw-Code;1.0.0.0,Hnisi-Fw-Dao;1.0.0.0
Require-Table:
S_USER,S_FRAMEWORK_MENU
Require-View:
V_TODO_LIST
7.参数配置
模块的一些固定的参数可配置到配置文件中。
配置文件位于/src/main/resources/config/目录下。
具体配置文件及说明如下。
配置文件名
说明
/config/模块简称/config.properties
配置开发、测试和生产环境都相同的参数
/config/模块简称/config-dev.properties
配置开发环境需要的参数
/config/模块简称/config-test.properties
配置测试环境需要的参数
/config/模块简称/config-product.properties
配置生产环境需要的参数
/config/模块简称/log4j.properties
配置log4j日志的参数
WEB应用同样需要包含以上这些配置文件,WEB应用的配置文件直接存放到config目录下。
WEB应用的config.properties配置文件必须包要配置SYSTEM.TYPE参数。
核心模块通过SYSTEM.TYPE参数加载相应的配置文件。
SYSTEM.TYPE参数说明如下。
参数配置
说明
SYSTEM.TYPE=dev
开发模式,加载config-dev.properties文件
SYSTEM.TYPE=test
测试模式,加载config-test.properties文件
SYSTEM.TYPE=product
生产模式,加载config-product.properties文件
8.数据库检查
9.核心模块
9.1核心模块作用
核心模块的主要作用如下:
Ø进行模块依赖检查
Ø进行数据库版本检查
Ø提供工具类支持
Ø提供日志支持
Ø第三方框架依赖配置(开发阶段,由maven配置)
9.2启动检查
启动检查包括模块依赖检查和数据库检查。
9.2.1模块依赖检查
模块依赖检查主要是在系统启动的过程中,通过MANIFEST.MF文件配置的依赖关系检查启动模块依赖的其他模块是否存在。
如果不存在则进行提示询问是否继续启动应用。
9.2.2数据库检查
核心模块在系统启动的过程中进行提供数据库的相关检查支持。
具体请参考第7章数据库版本检查。
9.3工具类
核心模块为其他模块提供常用的工具类。
方便其他模块的调用。
9.4日志支持
核对模块为其他模块提供日志支持,主要是对log4j的支持。
由于不同模块可能存在不同的日志输出需求,因此核心模块支持每个模块都可以有自己的日志配置文件。
每个模块的日志配置文件存放路径为:
/src/main/resources/config/模块简称/log4j.properties
10.附录
10.1MANIFEST.MF文件编辑问题
MANIFEST.MF文件有着严格的格式要求,甚至一个空格都会引起错误。
因此在编写MANIFEST.MF文件时需要严格遵循如下格式说明。
10.1.1MANIFEST.MF格式说明
1.文件中的内容以键值对的形式出现,键值对之间采用"冒号+空格"进行分隔(注意:
冒号后的空格必须有,否则格式有错误)
2.文件每行最多72个字符,可以分多行写,但是在行的末尾必须加上空格符作为续行符(注意:
末尾的续行符不能少)
3.文件的最后必须要空两行,并且这两行都必须顶格
4.通常指定Class-Path时会采用每一行一个JAR包的方法,因为每一行的长度有限制,当JAR较多时容易超过
10.1.2MANIFEST.MF示例
Manifest-Version:
1.0
Bundle-Type:
Hnisi
Bundle-Name:
Hnisi-Fw-Demo
Bundle-Version:
1.0.0.0
Bundle-Description:
测试模块
Bundle-Version-Compatible:
0.0.0.1
Require-Bundle:
Hnisi-Fw-Code;1.0.0.0,Hnisi-Fw-Dao;1.0.0.0
Require-Table:
S_USER,S_FRAMEWORK_MENU
Require-View:
V_TODO_LIST