Maven高级-分模块开发&依赖管理

这篇具有很好参考价值的文章主要介绍了Maven高级-分模块开发&依赖管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目标

  • 理解并实现分模块开发

1,分模块开发


1.1 分模块开发设计

(1)按照功能拆分

我们现在的项目都是在一个模块中,比如前面的SSM整合开发。虽然这样做功能也都实现了,但是也存在了一些问题,我们拿银行的项目为例来聊聊这个事。

  • 网络没有那么发达的时候,我们需要到银行柜台或者取款机进行业务操作
  • 随着互联网的发展,我们有了电脑以后,就可以在网页上登录银行网站使用U盾进行业务操作
  • 再来就是随着智能手机的普及,我们只需要用手机登录APP就可以进行业务操作

上面三个场景出现的时间是不相同的,如果非要把三个场景的模块代码放入到一个项目,那么当其中某一个模块代码出现问题,就会导致整个项目无法正常启动,从而导致银行的多个业务都无法正常班理。所以我们会按照功能将项目进行拆分。

(2)按照模块拆分

比如电商的项目中,有订单和商品两个模块,订单中需要包含商品的详细信息,所以需要商品的模型类,商品模块也会用到商品的模型类,这个时候如果两个模块中都写模型类,就会出现重复代码,后期的维护成本就比较高。我们就想能不能将它们公共的部分抽取成一个独立的模块,其他模块要想使用可以像添加第三方jar包依赖一样来使用我们自己抽取的模块,这样就解决了代码重复的问题,这种拆分方式就说我们所说的按照模块拆分。

Maven高级-分模块开发&依赖管理

经过两个案例的分析,我们就知道:

  • 将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享。

刚刚我们说了可以将domain层进行拆分,除了domain层,我们也可以将其他的层也拆成一个个对立的模块,如:

Maven高级-分模块开发&依赖管理

这样的话,项目中的每一层都可以单独维护,也可以很方便的被别人使用。关于分模块开发的意义,我们就说完了,说了这么多好处,那么该如何实现呢?


1.2 分模块开发实现

前面我们已经完成了SSM整合,接下来,咱们就基于SSM整合的项目来实现对项目的拆分。


1.2.1 环境准备

资料\maven_02_ssm部署到IDEA中,将环境快速准备好,部署成功后,项目的格式如下:

Maven高级-分模块开发&依赖管理


1.2.2 抽取domain层


步骤1:创建新模块

创建一个名称为maven_03_pojo的jar项目,为什么项目名是从02到03这样创建,原因后面我们会提到,这块的名称可以任意。

Maven高级-分模块开发&依赖管理


步骤2:项目中创建domain包

maven_03_pojo项目中创建com.itheima.domain包,并将maven_02_ssm中Book类拷贝到该包中

Maven高级-分模块开发&依赖管理


步骤3:删除原项目中的domain包

删除后,maven_02_ssm项目中用到Book的类中都会有红色提示,如下:

Maven高级-分模块开发&依赖管理

**说明:**出错的原因是maven_02_ssm中已经将Book类删除,所以该项目找不到Book类,所以报错

要想解决上述问题,我们需要在maven_02_ssm中添加maven_03_pojo的依赖。


步骤4:建立依赖关系

maven_02_ssm项目的pom.xml添加maven_03_pojo的依赖

<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>maven_03_pojo</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

因为添加了依赖,所以在maven_02_ssm中就已经能找到Book类,所以刚才的报红提示就会消失。


步骤5:编译maven_02_ssm项目

编译maven_02_ssm你会在控制台看到如下错误

Maven高级-分模块开发&依赖管理

错误信息为:不能解决maven_02_ssm项目的依赖问题,找不到maven_03_pojo这个jar包。

为什么找不到呢?

原因是Maven会从本地仓库找对应的jar包,但是本地仓库又不存在该jar包所以会报错。

在IDEA中是有maven_03_pojo这个项目,所以我们只需要将maven_03_pojo项目安装到本地仓库即可。


步骤6:将项目安装本地仓库

将需要被依赖的项目maven_03_pojo,使用maven的install命令,把其安装到Maven的本地仓库中。

Maven高级-分模块开发&依赖管理

安装成功后,在对应的路径下就看到安装好的jar包

Maven高级-分模块开发&依赖管理

**说明:**具体安装在哪里,和你们自己电脑上Maven的本地仓库配置的位置有关。

当再次执行maven_02_ssm的compile的命令后,就已经能够成功编译。


1.2.3 抽取Dao层


步骤1:创建新模块

创建一个名称为maven_04_dao的jar项目

Maven高级-分模块开发&依赖管理


步骤2:项目中创建dao包

maven_04_dao项目中创建com.itheima.dao包,并将maven_02_ssm中BookDao类拷贝到该包中

Maven高级-分模块开发&依赖管理

maven_04_dao中会有如下几个问题需要解决下:

Maven高级-分模块开发&依赖管理

  • 项目maven_04_dao的BookDao接口中Book类找不到报错

    • 解决方案在maven_04_dao项目的pom.xml中添加maven_03_pojo项目

      <dependencies>
          <dependency>
              <groupId>com.itheima</groupId>
              <artifactId>maven_03_pojo</artifactId>
              <version>1.0-SNAPSHOT</version>
          </dependency>
      </dependencies>
      
  • 项目maven_04_dao的BookDao接口中,Mybatis的增删改查注解报错

    • 解决方案在maven_04_dao项目的pom.xml中添加mybatis的相关依赖

      <dependencies>
          <dependency>
              <groupId>org.mybatis</groupId>
              <artifactId>mybatis</artifactId>
              <version>3.5.6</version>
          </dependency>
      
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>5.1.47</version>
          </dependency>
      </dependencies>
      

步骤3:删除原项目中的dao包

删除Dao包以后,因为maven_02_ssm中的BookServiceImpl类中有使用到Dao的内容,所以需要在maven_02_ssm的pom.xml添加maven_04_dao的依赖

<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>maven_04_dao</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

此时在maven_02_ssm项目中就已经添加了maven_03_pojomaven_04_dao

Maven高级-分模块开发&依赖管理

再次对maven_02_ssm项目进行编译,又会报错,如下:

Maven高级-分模块开发&依赖管理

和刚才的错误原因是一样的,maven在仓库中没有找到maven_04_dao,所以此时我们只需要将maven_04_dao安装到Maven的本地仓库即可。


步骤4:将项目安装到本地仓库

将需要被依赖的项目maven_04_dao,使用maven的install命令,把其安装到Maven的本地仓库中。

Maven高级-分模块开发&依赖管理

安装成功后,在对应的路径下就看到了安装好对应的jar包

Maven高级-分模块开发&依赖管理

当再次执行maven_02_ssm的compile的指令后,就已经能够成功编译。


1.2.4 运行测试并总结

将抽取后的项目进行运行,测试之前的增删改查功能依然能够使用。

所以对于项目的拆分,大致会有如下几个步骤:

(1) 创建Maven模块

(2) 书写模块代码

分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分。拆分方式可以按照功能拆也可以按照模块拆。

(3)通过maven指令安装模块到本地仓库(install 指令)

团队内部开发需要发布模块功能到团队内部可共享的仓库中(私服),私服我们后面会讲解。


2,依赖管理

我们现在已经能把项目拆分成一个个独立的模块,当在其他项目中想要使用独立出来的这些模块,只需要在其pom.xml使用标签来进行jar包的引入即可。

其实就是依赖,关于依赖管理里面都涉及哪些内容,我们就一个个来学习下:

  • 依赖传递
  • 可选依赖
  • 排除依赖

我们先来说说什么是依赖:

依赖指当前项目运行所需的jar,一个项目可以设置多个依赖。

格式为:

<!--设置当前项目所依赖的所有jar-->
<dependencies>
    <!--设置具体的依赖-->
    <dependency>
        <!--依赖所属群组id-->
        <groupId>org.springframework</groupId>
        <!--依赖所属项目id-->
        <artifactId>spring-webmvc</artifactId>
        <!--依赖版本号-->
        <version>5.2.10.RELEASE</version>
    </dependency>
</dependencies>

2.1 依赖传递与冲突问题

回到我们刚才的项目案例中,打开Maven的面板,你会发现:

Maven高级-分模块开发&依赖管理

在项目所依赖的这些jar包中,有一个比较大的区别就是有的依赖前面有箭头>,有的依赖前面没有。

那么这个箭头所代表的含义是什么?

打开前面的箭头,你会发现这个jar包下面还包含有其他的jar包

Maven高级-分模块开发&依赖管理

你会发现有两个maven_03_pojo的依赖被加载到Dependencies中,那么maven_04_dao中的maven_03_pojo能不能使用呢?

要想验证非常简单,只需要把maven_02_ssm项目中pom.xml关于maven_03_pojo的依赖注释或删除掉

Maven高级-分模块开发&依赖管理

在Dependencies中移除自己所添加maven_03_pojo依赖后,打开BookServiceImpl的类,你会发现Book类依然存在,可以被正常使用

Maven高级-分模块开发&依赖管理

这个特性其实就是我们要讲解的依赖传递

依赖是具有传递性的:

Maven高级-分模块开发&依赖管理

说明: A代表自己的项目;B,C,D,E,F,G代表的是项目所依赖的jar包;D1和D2 E1和E2代表是相同jar包的不同版本

(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包,有多个不同的版本,因而造成类包版本冲突。

情况一: 在maven_02_ssm的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>

Maven高级-分模块开发&依赖管理

通过对比,会发现一个结论

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

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

  • 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

但是对应上面这些结果,大家不需要刻意去记它。因为不管Maven怎么选,最终的结果都会在Maven的Dependencies面板中展示出来,展示的是哪个版本,也就是说它选择的就是哪个版本,如:

Maven高级-分模块开发&依赖管理

如果想更全面的查看Maven中各个坐标的依赖关系,可以点击Maven面板中的show Dependencies

Maven高级-分模块开发&依赖管理

在这个视图中就能很明显的展示出jar包之间的相互依赖关系。


2.2 可选依赖和排除依赖

依赖传递介绍完以后,我们来思考一个问题,

Maven高级-分模块开发&依赖管理

  • maven_02_ssm 依赖了 maven_04_dao
  • maven_04_dao 依赖了 maven_03_pojo
  • 因为现在有依赖传递,所以maven_02_ssm能够使用到maven_03_pojo的内容
  • 如果说现在不想让maven_02_ssm依赖到maven_03_pojo,有哪些解决方案?

**说明:**在真实使用的过程中,maven_02_ssm中是需要用到maven_03_pojo的,我们这里只是用这个例子描述我们的需求。因为有时候,maven_04_dao出于某些因素的考虑,就是不想让别人使用自己所依赖的maven_03_pojo。


方案一:可选依赖

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

maven_04_dao的pom.xml,在引入maven_03_pojo的时候,添加optional

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

此时BookServiceImpl就已经报错了,说明由于maven_04_dao将maven_03_pojo设置成可选依赖,导致maven_02_ssm无法引用到maven_03_pojo中的内容,导致Book类找不到。

Maven高级-分模块开发&依赖管理


方案二:排除依赖

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

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

<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>maven_04_dao</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--排除依赖是隐藏当前资源对应的依赖关系-->
    <exclusions>
        <exclusion>
            <groupId>com.itheima</groupId>
            <artifactId>maven_03_pojo</artifactId>
        </exclusion>
    </exclusions>
</dependency>

这样操作后,BookServiceImpl中的Book类一样也会报错。

当然exclusions标签带s说明我们是可以依次排除多个依赖到的jar包,比如maven_04_dao中有依赖junit和mybatis,我们也可以一并将其排除。

<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>maven_04_dao</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--排除依赖是隐藏当前资源对应的依赖关系-->
    <exclusions>
        <exclusion>
            <groupId>com.itheima</groupId>
            <artifactId>maven_03_pojo</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </exclusion>
    </exclusions>
</dependency>

介绍我这两种方式后,简单来梳理下,就是

  • A依赖B,B依赖C,C通过依赖传递会被A使用到,现在要想办法让A不去依赖C
  • 可选依赖是在B上设置<optional>,A不知道有C的存在,
  • 排除依赖是在A上设置<exclusions>,A知道有C的存在,主动将其排除掉。

学习笔记 from 黑马程序员

By – Suki 2023/4/6文章来源地址https://www.toymoban.com/news/detail-405866.html

到了这里,关于Maven高级-分模块开发&依赖管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • maven 模块打包时包含依赖和打包可执行的jar

    maven 模块打包 1)maven 模块打包jar文件时,指定包含依赖(with-dependencies); 2)maven 模块打包jar文件时,指定入口MainClass、打包生成可执行的jar; vi qftools/common/src/main/java/com/xxx/qftools/common/Main.java package com.xxx.qftools.common; public class Main {     public static void main(String args[]) {    

    2024年02月14日
    浏览(42)
  • 聊聊Maven的依赖传递、依赖管理、依赖作用域

    在Maven中,依赖是会传递的,假如在业务项目中引入了 spring-boot-starter-web 依赖: 那么业务项目不仅直接引入了 spring-boot-starter-web 依赖,还间接引入了 spring-boot-starter-web 的依赖项: spring-boot-starter 、 spring-boot-starter-json 、 spring-boot-starter-tomcat 、 spring-web 、 spring-webmvc 。 Maven依

    2024年02月08日
    浏览(30)
  • Maven分模块-继承-聚合-私服的高级用法

    JavaWeb知识,介绍Maven的高级用法!!! Maven 是一款构建和管理 Java 项目的工具 ,在需要开发一些中大型的项目,此时仅凭前面所学习的 Maven 的基础知识就比较难以应对了。还需要学习 Maven 提供的一些高级的功能,这些功能在构建和管理 Java 项目的时候用的也是非常多的。

    2024年02月13日
    浏览(28)
  • maven多模块----子模块相互依赖打包时报错找不到类的解决方案

    在被依赖的模块pom文件中加上如下配置: 注:如果你的配置文件就是如上配置,那么你需要在maven打包的时候,install一下,就可以依赖了

    2024年02月16日
    浏览(39)
  • Maven高级操作--分模块设计、聚合、继承和私服

    问题:当项目做大做强的时候,前面的基础Spring开发的框架都无法满足java大型项目的维护和复用,而且团队合作也会造成较大的困难。 所以就需要 分模块设计 :将项目按照功能拆分成若干个子模块,方便项目的 管理维护 、 扩展 ,也方便模块间的 相互调用 , 资源共享 。

    2024年02月11日
    浏览(32)
  • maven-依赖管理-下

    依赖冲突 特殊优先 特殊优先∶当同级配置了相同资源的不同版本,后配置的覆盖先配置的(提醒:要尽量避免这种没有意义的冲突) 修改D:java_projectsmaven_Apom.xml, 引入mysql5.1 根据特殊优先原则: maven_A 生效的是mysql5.1.43 测试完后,注销到引入mysql5.1.43 , 这里是为了验证. 可选依

    2024年02月16日
    浏览(56)
  • 基于IDEA 进行Maven依赖管理

    Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。 我们通过定义 POM 文件,

    2024年01月23日
    浏览(40)
  • 基于 IDEA 进行 Maven 依赖管理

             Maven 依赖管理是 Maven 软件中最重要的功能之一。 Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。        

    2024年01月19日
    浏览(38)
  • Maven项目中的依赖出现版本冲突,最终发现是对Dependency Scope理解有误

    再来个文章目录 本文记录一下遇到maven依赖版本冲突后的排查过程说明以及问题原因说明 下面还有投票,帮忙投个票👍 最近加入了 Apache Dubbo 开源社区,成为了一名Dubbo Contributor。在熟悉Dubbo中的各个RPC协议时根据官网提供的示例搭建了一个示例。在熟悉过后想看下谷歌提供

    2023年04月09日
    浏览(46)
  • maven install命令:将包安装在本地仓库,供本地的其它工程或者模块依赖

    有时候,自己本地的maven工程依赖于本地的其它工程,或者manven工程中的一个模块依赖于另外的模块,可以执行maven的install命令,将被依赖的包安装在maven本地仓库。 maven的install插件的介绍可以参考:https://maven.apache.org/plugins/maven-install-plugin/ maven的install插件有三个goals: ins

    2024年02月14日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包