前言

对于复杂庞大的项目,maven的熟练使用可以大大提高工作效率

分模块开发

开发的模块可以独立出来,作为一个资源,当需要使用时可以通过依赖的形式来引用

1.1 分模块开发理念

将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享。这样的话,项目中的每一层都可以单独维护,也可以很方便的被别人使用

1.按照功能拆分

为了避免项目中某一个模块代码出现问题,导致整个项目无法正常启动,我们会按照功能将项目进行拆分

2.按照模块拆分

为了提高代码复用性

可以将公共的部分抽取成一个独立的模块,其他模块要想使用可以像添加第三方jar包依赖一样来使用我们自己抽取的模块,这样就解决了代码重复的问题(比如订单用户)

1.2 分模块开发实现

建立依赖关系

maven01项目的pom.xml添加maven03的依赖

<dependency>
    <groupId>ppgoodlike.yu7daily</groupId>
    <artifactId>maven03</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

在IDEA中是有maven03这个项目,所以我们只需要将maven03项目安装到本地仓库即可,将需要被依赖的项目maven03,使用maven的install命令,把其安装到Maven的本地仓库中。否则会出现编译错误!

2.依赖管理

2.1 依赖传递与冲突问题

(1) A依赖了B和C,B和C有分别依赖了其他jar包,所以在A项目中就可以使用上面所有jar包,这就是所谓的依赖传递

(2) 依赖传递有直接依赖和间接依赖

直接依赖:在当前项目中通过依赖配置建立的依赖关系

间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源

  • 相对于A来说,A直接依赖B和C,间接依赖了D1,E1,G,F,D2和E2
  • 相对于B来说,B直接依赖了D1和E1,间接依赖了G
  • 直接依赖和间接依赖是一个相对的概念

(3)因为有依赖传递的存在,就会导致jar包在依赖的过程中出现冲突问题,具体什么是冲突?Maven是如何解决冲突的?

这里所说的依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。

情况一: 在maven01的pom.xml中添加两个不同版本的Junit依赖:

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
</dependencies>

特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。

情况二:

路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高

  • A通过B间接依赖到E1
  • A通过C间接依赖到E2
  • A就会间接依赖到E1和E2,Maven会按照层级来选择,E1是2度,E2是3度,所以最终会选择E1

情况三:

声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的

  • A通过B间接依赖到D1
  • A通过C间接依赖到D2
  • D1和D2都是两度,这个时候就不能按照层级来选择,需要按照声明来,谁先声明用谁,也就是说B在C之前声明,这个时候使用的是D1,反之则为D2

2.2 可选依赖和排除依赖

为了解决依赖的版本冲突问题,通常可以隐藏对外的资源关系

方案一:可选依赖

可选依赖指对外隐藏当前所依赖的资源—不透明

maven04的pom.xml,在引入maven03的时候,添加optional

<dependency>
    <groupId>ppgoodlike.yu7daily</groupId>
    <artifactId>maven03</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递-->
    <optional>true</optional>
</dependency>

方案二:排除依赖

排除依赖指主动断开依赖的资源,被排除的资源无需指定版本—不需要

前面我们已经通过可选依赖实现了阻断maven03的依赖传递,对于排除依赖,则指的是已经有依赖的事实,也就是说maven01项目中已经通过依赖传递用到了maven03,此时我们需要做的是将其进行排除,所以接下来需要修改maven01的pom.xml

<dependency>
    <groupId>ppgoodlike.yu7daily</groupId>
    <artifactId>maven04</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--排除依赖是隐藏当前资源对应的依赖关系-->
    <exclusions>
        <exclusion>
            <groupId>ppgoodlike.yu7daily</groupId>
            <artifactId>maven03</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • A依赖B,B依赖C,C通过依赖传递会被A使用到,现在要想办法让A不去依赖C
  • 可选依赖是在B上设置<optional>,A不知道有C的存在,
  • 排除依赖是在A上设置<exclusions>,A知道有C的存在,主动将其排除掉。

3.聚合和继承 

3.1 聚合

1.所谓聚合:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合

2.聚合工程:通常是一个不具有业务功能的"空"工程(有且仅有一个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">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ppgoodlike.yu7daily</groupId>
    <artifactId>maven01</artifactId>
    <version>1.0-RELEASE</version>
    <packaging>pom</packaging>
    <!--设置管理的模块名称-->
    <modules>
        <module>../maven01</module>
        <module>../maven03</module>
        <module>../maven04</module>
    </modules>
</project>

测试发现,当maven01compile被点击后,所有被其管理的项目都会被执行编译操作。这就是聚合工程的作用。

聚合工程管理的项目在进行运行的时候,会按照项目与项目之间的依赖关系来自动决定执行的顺序和配置的顺序无关。

最后总结一句话就是,聚合工程主要是用来管理项目。

3.2 继承

所谓继承:描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承

将所有项目公共的jar包依赖提取到父工程的pom.xml中,子项目就可以不用重复编写,简化开发

将所有项目的jar包配置到父工程的dependencyManagement标签下,实现版本管理,方便维护

注:dependencyManagement标签不真正引入jar包,只是管理jar包的版本,子项目在引入的时候,只需要指定groupId和artifactId,不需要加version

注:当dependencyManagement标签中jar包版本发生变化,所有子项目中有用到该jar包的地方对应的版本会自动随之更新

最后总结一句话就是,父工程主要是用来快速配置依赖jar包和管理项目中所使用的资源。

实现步骤:

1.创建Maven模块,设置打包类型为pom

<packaging>pom</packaging>

2.在父工程的pom文件中配置依赖关系(子工程将沿用父工程中的依赖关系),一般只抽取子项目中公有的jar包

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    ...
</dependencies>

3.在父工程中配置子工程中可选的依赖关系

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>ppgoodlike.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
    </dependencies>
    ...
</dependencyManagement>

4.在子工程中配置当前工程所继承的父工程

<!--定义该工程的父工程-->
<parent>
    <groupId>ppgoodlike.yu7daily</groupId>
    <artifactId>maven01</artifactId>
    <version>1.0-RELEASE</version>
    <!--填写父工程的pom文件,可以不写-->
    <relativePath>../maven01/pom.xml</relativePath>
</parent>

5.在子工程中配置使用父工程中可选依赖的坐标

<dependencies>
    <dependency>
        <groupId>ppgoodlike.alibaba</groupId>
        <artifactId>druid</artifactId>
    </dependency>
</dependencies>

注意事项:

1.子工程中使用父工程中的可选依赖时,仅需要提供群组id和项目id,无需提供版本,版本由父工程统一提供,避免版本冲突

2.子工程中还可以定义父工程中没有定义的依赖关系,只不过不能被父工程进行版本统一管理。

3.3 聚合VS继承

两种之间的作用:

  • 聚合用于快速构建项目,对项目进行管理
  • 继承用于快速配置和管理子项目中所使用jar包的版本

聚合和继承的相同点:

  • 聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
  • 聚合与继承均属于设计型模块,并无实际的模块内容

聚合和继承的不同点:

  • 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
  • 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己

4.属性

为了解决更新多个jar包的版本,而出现漏改导致程序出问题,可以声明一个变量,在其他地方使用该变量,当变量的值发生变化后,所有使用变量的地方,就会跟着修改,以spring、junit、mybatis-spring为例

4.1 定义父工程属性

<properties>
    <spring.version>5.2.10.RELEASE</spring.version>
    <junit.version>4.12</junit.version>
    <mybatis-spring.version>1.3.0</mybatis-spring.version>
</properties>

4.2 修改依赖的version

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>

5.配置文件加载属性

为了让maven管理范围更大,我们可以在父工程中定义属性通过配置文件引用的方式来完成配置

5.1 父工程定义属性

<properties>
   <jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>

5.2 jdbc.properties文件中引用属性

在jdbc.properties,将jdbc.url的值直接获取Maven配置的属性

jdbc.driver=ppgoodlike.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=284650

5.3 设置maven过滤文件范围

Maven在默认情况下是从当前项目的src\main\resources下读取文件进行打包。现在我们需要打包的资源文件是在maven01下,需要我们通过配置来指定下具体的资源目录

<build>
    <resources>
        <!--设置资源目录-->
        <resource>
            <directory>../maven01/src/main/resources</directory>
            <!--设置能够解析${},默认是false -->
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

directory路径前要添加../的原因是maven01相对于父工程的pom.xml路径是在其上一层的目录中,所以需要添加。

到此这篇关于Maven分模块开发与依赖管理和聚合和继承及属性深入详细介绍的文章就介绍到这了,更多相关Maven分模块开发内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Maven分模块开发与依赖管理和聚合和继承及属性深入详细介绍的更多相关文章

  1. maven配置阿里云仓库的实现方法

    本文主要介绍了maven配置阿里云仓库的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. 关于Maven混合配置私有仓库和公共仓库的问题

    这篇文章主要介绍了Maven混合配置私有仓库和公共仓库,通过实例代码详细介绍了私有和公共仓库混合配置的方法,需要的朋友可以参考下

  3. 关于maven:pom文件的使用解析

    这篇文章主要介绍了关于maven:pom文件的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  4. SpringBoot浅析依赖管理与自动配置概念与使用

    一般来讲SpringBoot项目是不需要指定版本,而SSM项目是需要指定版本,SpringBoot的核心依赖就是spring-boot-starter-parent和spring-boot-starter-web两个依赖,这篇文章主要介绍了SpringBoot依赖管理与自动配置概念与使用

  5. Maven实现项目构建工具

    本文主要介绍了Maven实现项目构建工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. IDEA2022创建Maven Web项目教程(图文)

    本文主要介绍了IDEA2022创建Maven Web项目教程,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. Maven之导入thymeleaf依赖飘红问题及解决

    这篇文章主要介绍了Maven之导入thymeleaf依赖飘红问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  8. 关于maven使用过程中无法导入依赖的一些总结

    这篇文章主要介绍了关于maven使用过程中无法导入依赖的一些总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  9. Intellij IDEA根据maven依赖名查找它是哪个pom.xml引入的(图文详解)

    这篇文章主要介绍了Intellij IDEA根据maven依赖名查找它是哪个pom.xml引入的,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  10. Java Maven依赖传递,可选依赖,排除依赖详解

    这篇文章主要介绍了Java Maven依赖传递,可选依赖,排除依赖详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部