【Maven】命令行操作(续)(下)

简介: 【Maven】命令行操作(续)(下)

实验八:测试依赖的排除


1、概念


当A依赖B,B依赖C而且C可以传递到A的时候,但是A不想要C,需要在A里面把C排除掉。而往往这种情况都是为了避免jar包之间的冲突。

0a2653c851af460fa595bd959398a8f1.png

所以配置依赖的排除其实就是阻止某些jar包的传递。因为这样的jar包传递过来会和其他jar包冲突。


2、配置方式


<dependency>
  <groupId>maven</groupId>
  <artifactId>pro01-maven-java</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
  <!-- 使用excludes标签配置依赖的排除  -->
  <exclusions>
    <!-- 在exclude标签中配置一个具体的排除 -->
    <exclusion>
      <!-- 指定要排除的依赖的坐标(不需要写version) -->
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>


3、测试


测试的方式:在pro02-maven-web工程中配置对commons-logging的排除

<dependency>
  <groupId>maven</groupId>
  <artifactId>pro01-maven-java</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
  <!-- 使用excludes标签配置依赖的排除  -->
  <exclusions>
    <!-- 在exclude标签中配置一个具体的排除 -->
    <exclusion>
      <!-- 指定要排除的依赖的坐标(不需要写version) -->
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>

运行mvn dependency:tree命令查看效果:

[INFO] com.atguigu.maven:pro02-maven-web:war:1.0-SNAPSHOT

[INFO] ± junit:junit:jar:4.12:test

[INFO] | - org.hamcrest:hamcrest-core:jar:1.3:test

[INFO] ± javax.servlet:javax.servlet-api:jar:3.1.0:provided

[INFO] - com.atguigu.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile

[INFO] - org.springframework:spring-core:jar:4.0.0.RELEASE:compile

发现在spring-core下面就没有commons-logging了。


实验九: 继承


Maven工程之间,A工程继承B工程

本质上是A工程的pom.xml中的配置继承了B工程中pom.xml的配置。


作用


在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本。


操作


①创建父工程


注意:需要在pom配置文件中修改打包方式:

只有打包方式为pom的Maven工程能够管理其他Maven工程。


②创建模块工程


进入pro03-maven-parent工程的根目录,然后运行mvn archetype:generate命令来创建模块工程。

假设,我们创建三个模块工程:

0eacb84100b54626af849e6b562bf92a.png


③查看被添加新内容的父工程pom.xml


下面modules和module标签是聚合功能的配置

<modules>  
  <module>pro04-maven-module</module>
  <module>pro05-maven-module</module>
  <module>pro06-maven-module</module>
</modules>


④解读子工程的pom.xml


<!-- 使用parent标签指定当前工程的父工程 -->
<parent>
  <!-- 父工程的坐标 -->
  <groupId>com.atguigu.maven</groupId>
  <artifactId>pro03-maven-parent</artifactId>
  <version>1.0-SNAPSHOT</version>
</parent>
<!-- 子工程的坐标 -->
<!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 -->
<!-- <groupId>com.atguigu.maven</groupId> -->
<artifactId>pro04-maven-module</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->


⑤在父工程中配置依赖的统一管理


<!-- 使用dependencyManagement标签配置对依赖的管理 -->
<!-- 被管理的依赖并没有真正被引入到工程 -->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.0.0.RELEASE</version>
    </dependency>
  </dependencies>
</dependencyManagement>


⑥子工程中引用那些被父工程管理的依赖


关键点:省略版本号

<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。  -->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
<!-- 具体来说是由父工程的dependencyManagement来决定。 -->
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
  </dependency>
</dependencies>


⑦在父工程中升级依赖信息的版本


……
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.1.4.RELEASE</version>
      </dependency>
……

然后在子工程中运行mvn dependency:list(查看当前项目的已解析依赖)


⑧在父工程中声明自定义属性


<!-- 通过自定义属性,统一指定Spring的版本 -->
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <!-- 自定义标签,维护Spring版本数据 -->
  <atguigu.spring.version>4.3.6.RELEASE</atguigu.spring.version>
</properties>

在需要的地方使用${}的形式来引用自定义的属性名:

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

真正实现“一处修改,处处生效”。


实际意义


编写一套符合要求、开发各种功能都能正常工作的依赖组合并不容易。如果公司里已经有人总结了成熟的组合方案,那么再开发新项目时,如果不使用原有的积累,而是重新摸索,会浪费大量的时间。为了提高效率,我们可以使用工程继承的机制,让成熟的依赖组合方案能够保留下来。


实验十:聚合


1、聚合本身的含义


部分组成整体


2、Maven中的聚合


使用一个“总工程”将各个“模块工程”汇集起来,作为一个整体对应完整的项目。

  • 项目:整体——————模块:部分

概念的对应关系:

从继承关系角度来看:

  • 父工程——子工程

从聚合关系角度来看:

  • 总工程——模块工程


3、好处


  • 一键执行Maven命令
  • 配置聚合之后,各个模块工程会在总工程中展示一个列表,让项目中的各个模块一目了然。


4、聚合的配置


在总工程中配置modules即可:

<modules>  
    <module>pro04-maven-module</module>
    <module>pro05-maven-module</module>
    <module>pro06-maven-module</module>
  </modules>


5、依赖循环问题(要遵照拓扑序)


如果A工程依赖B工程,B工程依赖C工程,C工程又反过来依赖A工程,那么在执行构建操作时会报下面的错误:

[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:

这个错误的含义是:循环引用。

🌹写在最后💖: 路漫漫其修远兮,吾将上下而求索!伙伴们,再见!🌹🌹🌹


相关文章
|
2月前
|
Java 应用服务中间件 测试技术
Maven学习笔记(一):Maven基础(基于命令行的学习和应用)
Maven 是一款 Java 项目构建工具,主要用于管理 jar 包及其依赖关系。 本文主要了解Maven基础知识及基础应用,旨在为之后的进一步学习奠定基础。 内容上几近全为学习《尚硅谷2022版Maven教程》整理所得。 仅供参考。
243 81
Maven学习笔记(一):Maven基础(基于命令行的学习和应用)
|
5月前
|
Java Maven
Maven命令行参数详解
Maven命令行参数详解
178 0
|
5月前
|
缓存 Java Maven
IDEA如何把MAVEN项目打包成jar包并且用命令行启动
IDEA如何把MAVEN项目打包成jar包并且用命令行启动
76 0
|
6月前
|
Java Maven
Maven【4】(继承)(命令行操作)
Maven【4】(继承)(命令行操作)
44 1
|
6月前
|
Java Maven
Maven【3】( 依赖的范围,传递性和依赖的排除)(命令行操作)
Maven【3】( 依赖的范围,传递性和依赖的排除)(命令行操作)
63 0
|
6月前
|
Java Maven
Maven【2】( Web 工程依赖 Java 工程)(命令行操作)
Maven【2】( Web 工程依赖 Java 工程)(命令行操作)
60 0
|
6月前
|
Java Maven
Maven【1】(命令行操作)
Maven【1】(命令行操作)
61 0
|
存储 JavaScript Java
Maven基础学习---3、Maven的使用(命令行)
Maven基础学习---3、Maven的使用(命令行)
|
6月前
|
存储 JavaScript Java
【Maven从入门到如土】快速使用 Maven:命令行环境
【Maven从入门到如土】快速使用 Maven:命令行环境
106 0
|
Java Apache Maven
利用Maven工程命令行学习实操<第三课>(二)
利用Maven工程命令行学习实操<第三课>(二)
148 0