SSH框架之一详解maven搭建多模块项目
闲来无事,思量着自己搭建一个ssh框架,一来回顾熟悉一下ssh的内容,hibernate还就没用过了,生疏了都。二来整合一下,将其他掌握的和正在学习的框架核技术糅合到一起,就当是做一个demo练手了。
首先要把最基层的ssh框架运行起来,利用maven来构建,设想的是将业务分为多个模块,各个模块之间相互独立,甚至每个模块可以独立运行。查询若干资料可以利用maven创建model,然后整合为一个项目,今天先介绍一下基于maven的多模块项目搭建。
多模块其实就是按照层级的管理构建,项目包含一个pom.xml文件和若干个模块,每个模块有一个单独的pom.xml文件,通过pom的依赖和继承关系来构建项目层次。废话不多说,文采也不好,就直奔主题吧,首先贴一张项目结构图:

从上图中可以清楚的看到模块与项目以及模块与模块之间的层级关系,解释一下为什么这么分模块:
web模块存放的是客户端资源,包括js,css,以及jsp等。其他各模块为业务模块,common为公共模块,其中封装了公用的util工具类以及常量等。
打包方式为项目采用pom方式,业务模块打成jar,web模块打包成war包,最后的war包只包括web模块下的资源,其他业务模块以jar形式存在war包中WEB-INF/lib文件夹下
。
1、创建maven项目
Maven的安装和配置就不细说了,打开eclipse首先新建一个maven项目,删除src目录(项目中是没有代码的,所有的代码都是在各个模块中编写的),将buildpath中的source文件夹给remove掉,并将output文件夹修改到web模块下web-inf/classes文件夹下(没有则新建)。如下图所示:

打开pom.xml文件,添加或修改代码 :
<packaging>pom</packaging>
将项目的打包方式修改为pom方式,然后添加ssh相关的dependency和plugins等内容。
2、maven项目添加model
在项目上右键,新建选择maven model:

输入model名称,next配置sshFrame和groupId完成后可以看到工作空间中多了一个项目,打开模块pom文件,稍作修改:

重点关注parent标签,其配置的是该模块所属的父级项目,这里当然配置顶级的项目了,子模块的pom文件是继承字父级的pom文件的,所以在父级pom中定义的dependencies在子模块中可以直接引用,模块的属性也只需定义一个artifactId就可以了,groupId和version可以从父级继承,relativePath配置是父级pom.xml文件的相对路径,一般可以省略,不过有时会报错,说找不到父级pom,所以就干脆加上了。
这时候再次打开项目的pom.xml文件可以发现其中多了一个modules标签,其中内容就是刚刚新建的模块的artifactId。
其他模块的新建依此类推,过程是完全一样的。
3、编译以及运行
模块建立完成后,运行项目的pom文件,run as mvn install 下载jar,运行命令mvn compile进行编译,编译后可以在各个模块的target文件夹下看到编译后的class文件,web模块的输出路径最好也给改成web-inf/classes下。编译通过后就可以启动tomcat进行测试了,我使用的是tomcat插件,需要先进行配置。配置图如下:




打开tomcat中server.xml文件,添加context。
启动tomcat后访问localhost:8080/ssh/user/toUserIndex.action即可查看到页面效果了,该页面访问的是User模块的action。
4、问题以及解决方案
在搭建过程中出现了各种各样的错误,也一直在摸索着前进,总结一下出现的问题和解决办法。
(1) tomcat启动后不能加载到其他模块的代码,只加载到了web模块。
答:运行mvn compile编译后生成的class文件都是在各自模块的target目录下的,需要在tomcat配置中需要加载的模块勾上,如下图:

这样再启动tomcat就会加载到class文件了。
(2)、strus文件无法引入其他模块的struts_user.xml文件
答:struts可以使用include命令包含其他的配置文件file属性为文件的地址
<include file="struts_config/struts_user.xml"></include>
这样是可以正确加载文件的,注意struts_config前面是没有”/”的。
(3)、模块之间相互依赖的问题
项目过大,模块过多的话可能多个模块之间会存在相互依赖的关系,如下图:

这样使用maven编译不能通过,要解决循环依赖有两种解决办法,一种就是重构代码,从根本上解决依赖的问题。还有一种折中的办法,使用build-helper-maven-plugin解决相互依赖的问题我的解决办法就是先把相互依 赖的模块整合在一起,相当于把这些模块合并成一个单独的模块统一编译。
依赖关系转换为多对一的关系,如下图:

要想把A、B、C三个模块整合在一起编译,需要借助build-helper-maven-plugin插件 ,这个插件在Maven构建周期提供一些辅助功能,下面列出插件的提供的功能列表: build-helper:add-source:添加更多的构建源码目录 build-helper:add-test-source:添加更多的测试源码目录 build-helper:add-resource:添加更多的资源目录 build-helper:add-test-resource:添加更多的测试资源目录 build-helper:attach-artifact:在安装和部署周期附加artifacts build-helper:maven-version:添加一个指定当前Maven版本的属性 build-helper:parse-version:添加一个指定组件版本的属性 build-helper:released-version:决定当前项目的最终版本 build-helper:remove-project-artifact:从本地资源库中移除项目的artifacts build-helper:reserve-network-port:Reserve a list of random and unused network ports. 在这里我们要用到build-helper:add-source这个功能,将模块A、B、C的源码路径加 进来。 我们再添加一个辅助模块D,在辅助模块D中使用build-helper-maven-plugin插件,然 后让模块A、B、C都依赖于辅助模块D,模块D的POM模型如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<relativePath>../pom.xml</relativePath>
<artifactId>sshFrame</artifactId>
<groupId>org.lslvxy.sshFrame</groupId>
<version>${project.version}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sshFrame-pack</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<module.common.src>../sshFrame-common/src/main/java</module.common.src>
<module.user.src>../sshFrame-user/src/main/java</module.user.src>
<module.role.src>../sshFrame-role/src/main/java</module.role.src>
</properties>
<build>
<resources>
<resource>
<directory>../sshFrame-common/src/main/resources</directory>
</resource>
<resource>
<directory>../sshFrame-user/src/main/resources</directory>
</resource>
<resource>
<directory>../sshFrame-role/src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${module.common.src}</source>
<source>${module.user.src}</source>
<source>${module.role.src}</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>
这样就生成了一个模块pack,将其他模块的源代码和resource编译到pack模块中,然后其他模块依赖这一个pack模块,启动tomcat时加载pack模块和web模块即可正常启动项目。
5、总结
至此,一个简单的maven多模块项目就搭建成功了,也可以正常的运行和访问。
不过需要完善和丰富内容还需要一部分工作。源代码:
这个源码中包含了jquery easyui做的界面,也才刚刚开始做了一部分。
文采不好,写的很乱,如果有什么问题的话可以给我留言或者qq我。
--本篇完--
SSH框架之一详解maven搭建多模块项目的更多相关文章
- 用maven搭建多模块项目
首先,前面几次学习已经学会了安装maven,如何创建maven项目等,最近的学习,终于有点进展了,搭建一下企业级多模块项目. 好了,废话不多说,具体如下: 首先新建一个maven项目,pom.xml的 ...
- Eclipse下使用maven搭建多模块项目
暂时将项目分为如下几层: domain(域模型层).dao(数据库访问层).service(业务逻辑层).web(表现层),有需要再另行添加(如common等): 目录结构: 一.app 该层为父层, ...
- SSH框架流程详解
解图: 由图可见,有三个框架{ ①. Struts_2 ②. Spring ③. Hibernate } 框架 作用 本质 同等于 Struts_2 实现MVC / 控制.跳转 过滤器(Filter) ...
- Java一步一步构建web系统 在IDEA下用Maven搭建多模块项目
1.需求 做一个项目会有很多模块,主要是方便复用,通过各个模块之间聚合.模块也可以独立出来,如公用类库,也可以在做其它项目中使用.该文的实例会有两个模块:分别为dallin-web模块,dallin- ...
- eclipse中使用maven搭建多模块项目
暂时参考:https://blog.csdn.net/u012343297/article/details/79883870
- 【python3+request】python3+requests接口自动化测试框架实例详解教程
转自:https://my.oschina.net/u/3041656/blog/820023 [python3+request]python3+requests接口自动化测试框架实例详解教程 前段时 ...
- python+requests接口自动化测试框架实例详解
python+requests接口自动化测试框架实例详解 转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...
- redux-saga框架使用详解及Demo教程
redux-saga框架使用详解及Demo教程 前面我们讲解过redux框架和dva框架的基本使用,因为dva框架中effects模块设计到了redux-saga中的知识点,可能有的同学们会用dva框 ...
- 图文详解如何搭建Windows的Android C++开发环境
原地址:http://www.apkbus.com/android-18595-1-1.html //================================================= ...
随机推荐
- zTree插件之单选下拉菜单代码
<!--ztree树结构--> <link rel="stylesheet" type="text/css" href="asset ...
- sklearn Model-selection + Pipeline
1 GridSearch import numpy as np from sklearn.datasets import load_digits from sklearn.ensemble impor ...
- vs extension
优先级高低
- animation 的属性一共有 6 个值,详细介绍在此
animation 属性是一个简写属性,用于设置六个动画属性: animation-name animation-duration animation-timing-function animatio ...
- JQuery基础三
1.checkbox操作:全选.全不选.反选 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...
- dr.wondr博士随笔之三星某古董智能机GTXXXX 的取证恢复一例
大家好!欢迎来到我dr.wonde博士的微博! 这是dr.wonde的第一篇微博,不足之处,还请见谅. 今天dr.wonde给你们带来不可能的数据恢复任务之三星非智能机古董机GT-E1088C 的恢复 ...
- IsBackground的理解
1.当在主线程中创建了一个线程,那么该线程的IsBackground默认是设置为FALSE的. 2.当主线程退出的时候,IsBackground=FALSE的线程还会继续执行下去,直到线程执行结束. ...
- 循环多次ajax请求
最近在做网页前端,其中有个功能按钮是从数据表格中同时删除多条数据,涉及到循环多次ajax请求 但是老是出现一些请求被忽视的情况,应该是由于for循环在极短时间内被完成,所以第一次请求后的几次请求时,x ...
- img的hover事件闪动
今天给同学写一个相册照片鼠标浮动显示细节的效果,遇到了闪动的bug,也顺利解决,就写下来跟大家分享. 我使用的是'标签:hover + 标签'的形式,如果使用jquery的mouseover.mous ...
- AES对称加密和解密
package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...