Maven传递依赖及分模块化

什么是传递依赖

  • 当项目依赖一个jar包时,与这个jar包关联的其他jar包也会关联到当前项目,这种现象就是传递依赖。
  • 比如A项目依赖B项目,B又依赖C项目, 此时A中也包含了C的依赖。

依赖传递出现的问题

  • 依赖传递出现的问题:经常出现jar包冲突,
  • 解决方案:
    1. 直接排除指定的jar包
    2. 版本号限定原则

解决jar包冲突的方式(4种)

排除原则(常用)

  • 代码示例:
<dependencies>
   <dependency>
      <groupId>com.sdh</groupId>
      <artifactId>project01</artifactId>
      <version>1.0-SNAPSHOT</version>
      <!-- 排除依赖项目中的jar包 -->
      <exclusions>
          <exclusion>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
          </exclusion>
      </exclusions>
  </dependency>
</dependencies>

版本号限定原则(常用)

  • 代码示例:
<!-- 标记版本号 -->
<!--添加属性-->
<properties>
  <mysql.version>5.1.42</mysql.version>
</properties>

<!--02版本锁定-->
<dependencyManagement>
  <dependencies>
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>${mysql.version}</version>
      </dependency>
  </dependencies>
</dependencyManagement>
<!-- 依赖管理,上面已经锁定了版本号,这里不需要写版本号 -->
<dependencies>
  <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
  </dependency>
</dependencies>

路径就近原则(基本不用)

  • 就是依赖的项目中,哪个依赖的项目近就依赖那个项目中的包

第一声明优先原则(基本不用)

  • 依赖中,那个依赖先写的,就先依赖那个项目
  • 注意:如果是直接依赖,不遵循第一声明原则,后面会覆盖前面的依赖
  • 看图:左边路径就近原则,右边第一声明优先原则 Maven

传递依赖对依赖范围的影响

  • A项目直接依赖B项目(最左边一列A和B的依赖范围)
  • B项目直接依赖C项目(最上面一行B和C的依赖范围)
  • 交叉点A和C的依赖范围 Maven

分模块构建项目

  • 上面已经讲解了依赖,那么我们就可以把以前分层(MVC模式)的项目使用Maven模块,进行再次分离
  • 如图(每个模块都是一个Maven项目): Maven

理解继承和聚合

继承

  • 开发中多个项目有共同的jar包依赖,可以采用继承方式简化各个项目的pom文件,在父类的pom文件中依赖共同拥有的jar。
  • 继承是为了消除重复,如果将dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复。
  • 比如:设置编译版本、锁定mysql的版本的等,可以将这些重复的配置提取出来在父工程的pom.xml中定义。
  • 注意:
    1. 父级项目只能是pom打包方式。
    2. 子项目是一个Maven Module

聚合

  • 项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web三个工程最终会打一个独立的war运行。
  • 能够把项目的各个模块聚合在一起构建。一般用于分模块开发,最后整体打包发布。
  • 注意:
    1. 根项目(模块)是一个pom项目。
    2. 子模块:Maven Module
    3. 每个模块写完后需要上传到私服
    4. 打包,需要整体打包找到最后的war项目使用Tomcat加载
  • 实际中,我们会将一些庞大的项目拆分为若干模块进行开发
  • 三层+MVC 如下(打包方式jar war):
    1. dao (包含实体类、utils)———-jar
    2. service——jar
    3. web———-war

聚合与继承的关系

  • 聚合是为了方便快速构件项目。对于聚合模块来说,它知道有哪些被聚合的模块,但那些模块不知道这个聚合模块的存在;
  • 继承是为了消除重复配置。对于继承关系的父POM来说,它不知道有哪些子模块继承于它,但是子模块必须知道自己的父POM是什么。

案例演示继承和聚合

  • 第一步:创建父工程,修改pom.xml文件
  • 第二步:创建dao,并继承父工程
  • 第三步:创建service,并继承父工程
  • 第四步:创建web,并继承父工程
  • 第五步:运行
  • 注意:分模块开发项目编译、打包、安装需要使用使用父工程来整体操作。如果要操作单个子模块,最后先整体安装一次,因为单个子模块需要依赖信息。
  • 方法1:在maven-web工程的pom.xml中配置tomcat插件运行
  • 运行maven-web工程它会从本地仓库下载依赖的jar包,所以当maven-web依赖的jar包内容修改了必须及时发布到本地仓库,比如:maven-web依赖的maven-service修改了,需要及时将maven-service发布到本地仓库。
  • 方法2:在父工程的pom.xml中配置tomcat插件运行,自动聚合并执行
  • 推荐方法2,如果子工程都在本地,采用方法2则不需要子工程修改就立即发布到本地仓库,父工程会自动聚合并使用最新代码执行。
  • 注意:如果子工程和父工程中都配置了tomcat插件,运行的端口和路径以子工程为准。
  • 不推荐在pom.xml文件中配置Tomcat插件,因为不灵活,版本受限。可以配置自己的Tomcat。

pom.xml配置文件中

在配置文件中可以定义变量:

  # src/main/java/config9/test.properties
  # ${xx} 是动态取值
  username9=${username}
  name9=${name}
  url9=${url}
  finalName9=${build.finalName}
  basedir9=${basedir}

pom中定义 filtering=true,则配置文件中的 ${xx} 会填充数据

  <resource>
      <directory>src/main/java</directory>
      <excludes>
          <exclude>**/*.txt</exclude>
      </excludes>
      <!-- 导入的配置中如果有 ${xx} 表达式,则解析并填充值 -->
      <filtering>true</filtering>
  </resource>

pom文件中的标签和properties中的值可以获取

  <!-- pom.xml -->
  <artifactId>my-web</artifactId>
  ...
  <name>my-web Maven Webapp</name> <!-- ${name} -->
  <url>http://www.example.com</url> <!-- ${url} -->
  <properties>
      ...
      <username>sdh</username>  <!-- ${username} -->
  </properties>
  <build>
  	<finalName>my-web</finalName>  <!-- ${build.finalName} -->
      ...
      <resource>
          <directory>src/main/java</directory>
          <excludes>
              <exclude>**/*.txt</exclude>
          </excludes>
          <!-- 导入的配置中如果有 ${xx} 表达式,则解析并填充值 -->
          <filtering>true</filtering>
      </resource>
  </build>

filter

  • 定义一个properties文件
  # src/main/java/config/param.properties
  p1=111
  p2=222
  <build>
      ...
      <!-- 导入外部文件,${xx} 可以从中获取数据 -->
      <filters>
          <filter>src/main/java/config/param.properties</filter>
      </filters>
      ...
  </build>
  # 配置文件中获取参数
  pp=${p1}
  ppp=${p2}


转载请注明:Memory的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦