Maven工程的拆分与聚合

Maven工程的拆分与聚合

之前我们单独创建了一个Maven工程然后根据通过包的划分来分为 web层,service层,和dao层.

其实在一些大型项目中,我们可以通过模块来划分这个三个层

一个层对应一个单独的模块,然后一个人单独去开发一个模块

最后把这三个模块聚合起来,形成一个整体的项目

那我们今天来看一下,如何使用IDEA 来对Maven工程进行拆分合并

  1. 创建父工程,父工程的作用就是在其pom.xml文件中统一管理

子模块所需jar包,也就是说,我在父工程的pom文件中添加好jar

包后,子模块也就相当于有了此jar包,而无需在子模块的pom文件中,再次添加

File ----New—Project 弹出以下选择框

Maven工程的拆分与聚合

填写父工程的信息

Maven工程的拆分与聚合

继续下一步

Maven工程的拆分与聚合

创建好父工程后,可以删掉父工程的src目录只需要保留pom.xml文件即可

Maven工程的拆分与聚合

接下来我们创建web层的子模块

Maven工程的拆分与聚合

选择Maven 项目 选择 webapp模板

Maven工程的拆分与聚合

填写子模块信息

Maven工程的拆分与聚合

继续下一步,选择相应的信息

Maven工程的拆分与聚合

Maven工程的拆分与聚合

Web层的子模块就创建成功了

Maven工程的拆分与聚合

我们把WebMoudle的目录结构补完整

Maven工程的拆分与聚合

这时可以看下父工程的pom.xml文件

Maven工程的拆分与聚合

 

看看子工程的pom文件

Maven工程的拆分与聚合

接下来创建Service层的模块

Maven工程的拆分与聚合

创建Maven 不需要勾选模板,下一步即可

Maven工程的拆分与聚合

填写service模块的信息 下一步

Maven工程的拆分与聚合

填写Service模块名称

Maven工程的拆分与聚合

点击完成

Maven工程的拆分与聚合

然后创建Dao模块 创建方式跟创建Service模块一样,此处省略

Maven工程的拆分与聚合

接下来,我们要把这个三个模块聚合起来,就是说我们要在Web层调用Service层,在Service层调用Dao层.

那么就得添加依赖,也就是Web层添加依赖 ,依赖Service层,

Service层添加依赖,依赖Dao层 ,这样添加上依赖后,才能调用

看下如何添加依赖

先让Web层依赖上Service层 如下图所示

Maven工程的拆分与聚合

选择依赖模块

Maven工程的拆分与聚合

Maven工程的拆分与聚合

这样还没完,还得在Web模块得pom.xml文件中添加依赖,依赖上Service模块

<dependency>
    <groupId>org.westos</groupId>
    <artifactId>servicemodule</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
</dependency>

如图

Maven工程的拆分与聚合

然后,让Service模块依赖上Dao模块,做法跟上面一样

Maven工程的拆分与聚合

然后在Service的pom.xml文件中添加依赖 依赖上Dao模块

<dependencies>

    <dependency>

        <groupId>org.westos</groupId>

        <artifactId>daomodule</artifactId>

        <version>1.0-SNAPSHOT</version>

        <scope>compile</scope>

    </dependency>

</dependencies>

如图

Maven工程的拆分与聚合

这样我们三个模块,就依赖好了,下面我们把这个三个模块跑通

我们在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>

 

然后我在每个层中都创建了一个类,我们进行调用

Maven工程的拆分与聚合

这里有一个小技巧了解下

Maven工程的拆分与聚合

Service层调用Dao

Maven工程的拆分与聚合

下面是Dao层

Maven工程的拆分与聚合

下来我们发布项目

Maven工程的拆分与聚合

Maven工程的拆分与聚合

开启服务器运行项目

Maven工程的拆分与聚合

看控制台,三个模块都跑通了

Maven工程的拆分与聚合

 

下来比如我们要用SSH三个框架进行开发,那么我们就可以在

父工程中的pom.xml文件中添加三个框架的jar包

 

Maven工程的拆分与聚合

我们可已在IDEA的Maven项目管理模块菜单中查看项目中所有依赖的jar包

Maven工程的拆分与聚合

我们也可以显示所有jar包的树型结构图

Maven工程的拆分与聚合

关于Jar包版本冲突

在我们所依赖的jar包中可能会出现,多个版本不一致的jar包,那么在项目运行时会出现异常,所以如果有jar包冲突的话都需要排除

可以在IDEA jar包树型结构图中看到冲突jar包 如果是红色虚线

则表示有jar包冲突,可以右键虚线选择Exclude排除

下面给大家介绍一个排除jar包冲突的插件,叫做Maven Helper

用它排除jar包冲突的功能很强大

具体参考另一个文档

最后再说一个了解性的知识点

依赖范围对传递依赖的影响(了解)

       依赖会有依赖范围,依赖范围对传递依赖也有影响,有A、B、C,A依赖B、B依赖C,C可能是A的传递依赖,如下图:

Maven工程的拆分与聚合

       最左边一列为直接依赖,理解为A依赖B的范围,最顶层一行为传递依赖,理解为B依赖C的范围,行与列的交叉即为A传递依赖C的范围。

举例:

比如 A对 B 有 compile 依赖,B 对C有 runtime 依赖,那么根据表格所示A对C 有 runtime 依赖。

 

测试

dao依赖junit,scop为test

service依赖dao.

 

查看下图红色框内所示传递依赖范围:

Maven工程的拆分与聚合

 

所以maven-first所依赖的junit的jar没有加入到maven-web工程。

如果修改maven-first依赖junit的scop为compile,maven-first所依赖的junit的jar包会加入到maven-web工程中,符合上边表格所示,查看下图红色框内所示:

Maven工程的拆分与聚合

使用版本锁定实现冲突解决

首先父工程中pom.xml文件添加:

Maven工程的拆分与聚合

Maven工程的拆分与聚合

在使用坐标时,对于同一个框架,引入多次时,它的版本信息就会多次出现,所以

可以借用常量的思想,将这些版本号提取出来,在需要用到的时候,直接写版本的常量名称就可以了。

Maven工程的拆分与聚合

引用上面的常量

Maven工程的拆分与聚合