Maven工程的拆分与聚合
之前我们单独创建了一个Maven工程然后根据通过包的划分来分为 web层,service层,和dao层.
其实在一些大型项目中,我们可以通过模块来划分这个三个层
一个层对应一个单独的模块,然后一个人单独去开发一个模块
最后把这三个模块聚合起来,形成一个整体的项目
那我们今天来看一下,如何使用IDEA 来对Maven工程进行拆分合并
- 创建父工程,父工程的作用就是在其pom.xml文件中统一管理
子模块所需jar包,也就是说,我在父工程的pom文件中添加好jar
包后,子模块也就相当于有了此jar包,而无需在子模块的pom文件中,再次添加
File ----New—Project 弹出以下选择框
填写父工程的信息
继续下一步
创建好父工程后,可以删掉父工程的src目录只需要保留pom.xml文件即可
接下来我们创建web层的子模块
选择Maven 项目 选择 webapp模板
填写子模块信息
继续下一步,选择相应的信息
Web层的子模块就创建成功了
我们把WebMoudle的目录结构补完整
这时可以看下父工程的pom.xml文件
看看子工程的pom文件
接下来创建Service层的模块
创建Maven 不需要勾选模板,下一步即可
填写service模块的信息 下一步
填写Service模块名称
点击完成
然后创建Dao模块 创建方式跟创建Service模块一样,此处省略
接下来,我们要把这个三个模块聚合起来,就是说我们要在Web层调用Service层,在Service层调用Dao层.
那么就得添加依赖,也就是Web层添加依赖 ,依赖Service层,
Service层添加依赖,依赖Dao层 ,这样添加上依赖后,才能调用
看下如何添加依赖
先让Web层依赖上Service层 如下图所示
选择依赖模块
这样还没完,还得在Web模块得pom.xml文件中添加依赖,依赖上Service模块
<dependency>
<groupId>org.westos</groupId>
<artifactId>servicemodule</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
如图
然后,让Service模块依赖上Dao模块,做法跟上面一样
然后在Service的pom.xml文件中添加依赖 依赖上Dao模块
<dependencies> <dependency> <groupId>org.westos</groupId> <artifactId>daomodule</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies>
如图
这样我们三个模块,就依赖好了,下面我们把这个三个模块跑通
我们在Web层创建Servlet在Servlet中调用Service 在Service中调用Dao
首先我们要在父工程中的pom.xml文件中添加Web层所需的jar包,那么子模块,就无需添加了
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> </dependency> </dependencies>
然后我在每个层中都创建了一个类,我们进行调用
这里有一个小技巧了解下
Service层调用Dao
下面是Dao层
下来我们发布项目
开启服务器运行项目
看控制台,三个模块都跑通了
下来比如我们要用SSH三个框架进行开发,那么我们就可以在
父工程中的pom.xml文件中添加三个框架的jar包
我们可已在IDEA的Maven项目管理模块菜单中查看项目中所有依赖的jar包
我们也可以显示所有jar包的树型结构图
关于Jar包版本冲突
在我们所依赖的jar包中可能会出现,多个版本不一致的jar包,那么在项目运行时会出现异常,所以如果有jar包冲突的话都需要排除
可以在IDEA jar包树型结构图中看到冲突jar包 如果是红色虚线
则表示有jar包冲突,可以右键虚线选择Exclude排除
下面给大家介绍一个排除jar包冲突的插件,叫做Maven Helper
用它排除jar包冲突的功能很强大
具体参考另一个文档
最后再说一个了解性的知识点
依赖范围对传递依赖的影响(了解)
依赖会有依赖范围,依赖范围对传递依赖也有影响,有A、B、C,A依赖B、B依赖C,C可能是A的传递依赖,如下图:
最左边一列为直接依赖,理解为A依赖B的范围,最顶层一行为传递依赖,理解为B依赖C的范围,行与列的交叉即为A传递依赖C的范围。
举例:
比如 A对 B 有 compile 依赖,B 对C有 runtime 依赖,那么根据表格所示A对C 有 runtime 依赖。
测试
dao依赖junit,scop为test
service依赖dao.
查看下图红色框内所示传递依赖范围:
所以maven-first所依赖的junit的jar没有加入到maven-web工程。
如果修改maven-first依赖junit的scop为compile,maven-first所依赖的junit的jar包会加入到maven-web工程中,符合上边表格所示,查看下图红色框内所示:
使用版本锁定实现冲突解决
首先父工程中pom.xml文件添加:
在使用坐标时,对于同一个框架,引入多次时,它的版本信息就会多次出现,所以
可以借用常量的思想,将这些版本号提取出来,在需要用到的时候,直接写版本的常量名称就可以了。
引用上面的常量