maven扫盲(二)

依赖管理

        依赖管理是项目管理中非常重要的一环。几乎任何项目开发的时候需要都需要使用到库。而这些库很可能又依赖别的库,这样整个项目的依赖形成了一个树状结构,而随着这个依赖的树的延伸和扩大,一系列问题就会随之产生。Maven提供了一套完整的方法,让使用者可以轻松的管理项目的依赖。

        首先,查找第三方依赖,方式有:1. maven仓库信息官网 https://mvnrepository.com/搜索。2. mavensearch插件 ,在tools的maven-search搜索。然后只需将对应的依赖包<dependency>加入到我们pom文件的<dependencies>中即可。

        如果第三方依赖过多,我们需要提取版本号,统一管理。在<properties>标签里进行声明,命名随便,推荐使用:技术名.version,然后就可以在其他的<dependency>中的version属性中通过${技术名.version}引用,我们只要在<properties>里改版本,其他用到该技术的依赖<dependency>都跟着变了。

        可选属性scope,指定依赖生效范围/作用域:

<dependencies>
    <!-- 引入具体的依赖包 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
      
        <scope>runtime</scope>
    </dependency>

</dependencies>
```

        scope有以下几个值可以取compile(默认)、test、runtime、provided、system、import。compile在编译、运行、测试的时候都会导入依赖项。一般情况下是使用这个作用域。test只有在测试的时候会导入依赖项,比如juni库。如果一些依赖只有在测试的时候会用到,比如一些测试库,那么需要设置其作用域为test。runtime在编译时不会导入依赖项,运行的时候会导入依赖项。比如各种数据库驱动的jdbc实现库,编译的时候不会使用到这些库,但是运行的时候jdbc会动态加载会用到这些库。provided作用域在编译和测试的时候会引入依赖,但是运行时不会。有些库有运行环境提供,为了避免和运行环境已有库冲突需要设置作用域为provided。比如java web中的servlet库,tomcat容器自带这个库,所以编写web项目的时候需要声明servlet依赖的作用域为provided。

      

依赖传递与冲突:

依赖发生冲突,后续的依赖传递全部终止

   

在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:

        1.  下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。

        2.  依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。

        3.  本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项,并且也无法重新下载!

解决方案:

1.  检查网络连接和 Maven 仓库服务器状态。

2.  确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。

3.  清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的gav属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!

构建管理和插件配置

        

mvn clean  :清理编译或打包后的项目结构,删除target文件夹 

mvn compile :编译项目,生成target文件           

mvn test:     执行测试源码 (测试)               

mvn site :生成一个项目依赖信息的展示页面           

mvn package : 打包项目,生成war / jar 文件       

mvn install :打包后上传到maven本地仓库(本地部署)     

mvn deploy:   只打包,上传到maven私服仓库(私服部署)   

注意,命令执行需要我们进入到项目的跟路径,与pom.xml平级,本地部署或是私服仓库部署必须是jar包,war包是部署到远程服务器的打包方式。

周期→包含若干命令→包含若干插件,使用周期命令构建,简化构建过程!最终进行构建的是插件!

<build>
   <!-- jdk17 和 war包版本插件不匹配 -->
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.2</version>
        </plugin>
    </plugins>
</build>

继承与聚合

        Maven 继承是指在 Maven 的项目中,让一个项目作为父工程,让其他项目继承该配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。

1.继承语法
    -   父工程
    ```xml
    <groupId>com.atguigu.maven</groupId>
    <artifactId>pro03-maven-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->
    <packaging>pom</packaging>

    ```
    -   子工程
    ```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> -->
    ```
2.  父工程依赖统一管理
    -   父工程声明版本
        ```xml
        <!-- 使用dependencyManagement标签声明要导入的依赖 -->
        <!-- 被声明的依赖并没有真正被引入到工程 -->
        <dependencyManagement>
          <dependencies>
            <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-core</artifactId>
              <version>4.0.0.RELEASE</version>
            </dependency>
            <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-beans</artifactId>
              <version>4.0.0.RELEASE</version>
            </dependency>
            <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context</artifactId>
              <version>4.0.0.RELEASE</version>
            </dependency>
            <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-expression</artifactId>
              <version>4.0.0.RELEASE</version>
            </dependency>
            <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-aop</artifactId>
              <version>4.0.0.RELEASE</version>
            </dependency>
          </dependencies>
        </dependencyManagement>
        ```
    -   子工程引用版本
        ```xml
        <!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。  -->
        <!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
        <!-- 被管理的依赖真正引入到工程,这是由父工程的dependencyManagement来决定。 -->
        <dependencies>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
          </dependency>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
          </dependency>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
          </dependency>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
          </dependency>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
          </dependency>
        </dependencies>
        ```

        

Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程:通过聚合,可以优化构建顺序,对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。

父项目中包含的子项目列表。
    ```xml
    <project>
      <groupId>com.example</groupId>
      <artifactId>parent-project</artifactId>
      <packaging>pom</packaging>
      <version>1.0.0</version>
      <modules>
        <module>child-project1</module>
        <module>child-project2</module>
      </modules>
    </project>

需求案例

配置一个模拟电商平台的依赖,该平台包括用户服务、订单服务、通用工具模块等。

服务依赖:

1.  用户服务 (1.0.1)

    -   spring-context 6.0.6&#x20;

    -   spring-core 6.0.6

    -   spring-beans 6.0.6

    -   jackson-databind /  jackson-core / jackson-annotations 2.15.0&#x20;

2.  订单服务 (1.0.1)

    -  shiro-core 1.10.1&#x20;

    -  spring-context 6.0.6&#x20;

    -  spring-core 6.0.6

    -  spring-beans 6.0.6

3.  通用模块 (1.0.1)

    - commons-io 2.11.0

通过查询 https://mvnrepository.com可知1,2中存在某个依赖是另一个依赖的依赖的情况,可以不用重复导入。

   

1.  父模块搭建 (micro-shop)
  (1).创建父工程
  (2).pom.xml配置
        ```xml
        <?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>com.atguigu</groupId>
            <artifactId>micro-shop</artifactId>
            <version>1.0.1</version>
            <!-- 父工程不打包,所以选择pom值-->
            <packaging>pom</packaging>

            <properties>
                <spring.version>6.0.6</spring.version>
                <jackson.version>2.15.0</jackson.version>
                <shiro.version>1.10.1</shiro.version>
                <commons.version>2.11.0</commons.version>
                <maven.compiler.source>17</maven.compiler.source>
                <maven.compiler.target>17</maven.compiler.target>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            </properties>

            <!-- 依赖管理 -->
            <dependencyManagement>
                <dependencies>
                    <!-- spring-context会依赖传递core/beans -->
                    <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-context</artifactId>
                        <version>${spring.version}</version>
                    </dependency>

                    <!-- jackson-databind会依赖传递core/annotations -->
                    <dependency>
                        <groupId>com.fasterxml.jackson.core</groupId>
                        <artifactId>jackson-databind</artifactId>
                        <version>${jackson.version}</version>
                    </dependency>

                    <!-- shiro-core -->
                    <dependency>
                        <groupId>org.apache.shiro</groupId>
                        <artifactId>shiro-core</artifactId>
                        <version>${shiro.version}</version>
                    </dependency>
                    <!-- commons-io -->
                    <dependency>
                        <groupId>commons-io</groupId>
                        <artifactId>commons-io</artifactId>
                        <version>${commons.version}</version>
                    </dependency>

                </dependencies>

            </dependencyManagement>

            <dependencies>
                <!-- 父工程添加依赖,会自动传递给所有子工程,不推荐! -->
            </dependencies>

            <!-- 统一更新子工程打包插件-->
            <build>
                <!-- jdk17 和 war包版本插件不匹配 -->
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>3.2.2</version>
                    </plugin>
                </plugins>
            </build>

        </project>
        ```
2.  通用模块 (common-service)
    (1).创建模块
    (2).pom.xml配置
        ```xml
        <?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>
            <parent>
                <groupId>com.atguigu</groupId>
                <artifactId>micro-shop</artifactId>
                <version>1.0.1</version>
            </parent>
            <artifactId>common-service</artifactId>
            <!-- 打包方式默认就是jar!要部署到私服仓库供另外两个子模块使用-->
            <packaging>jar</packaging>

            <properties>
                <maven.compiler.source>17</maven.compiler.source>
                <maven.compiler.target>17</maven.compiler.target>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            </properties>

            <dependencies>
                <!-- 声明commons-io,继承父工程版本 -->
                <dependency>
                    <groupId>commons-io</groupId>
                    <artifactId>commons-io</artifactId>
                </dependency>
            </dependencies>

        </project>
        ```
3.  用户模块 (user-service)
   (1).创建模块
   (2). pom.xml配置
        ```xml
        <?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>  
          <parent> 
            <groupId>com.atguigu</groupId>  
            <artifactId>micro-shop</artifactId>  
            <version>1.0.1</version> 
          </parent>  
          <artifactId>user-service</artifactId>  
          <packaging>war</packaging>

          <properties> 
            <maven.compiler.source>17</maven.compiler.source>  
            <maven.compiler.target>17</maven.compiler.target>  
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
          </properties>

          <dependencies>
            <!-- 添加spring-context 自动传递 core / beans -->
            <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context</artifactId>
            </dependency>

            <!-- 添加jackson-databind 自动传递 core / annotations -->
            <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
            </dependency>
          </dependencies>
        </project>

        ```
4.  订单模块 (order-service)
    (1).创建模块
    (2).pom.xml
        ```xml
        <?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>
            <parent>
                <groupId>com.atguigu</groupId>
                <artifactId>micro-shop</artifactId>
                <version>1.0.1</version>
            </parent>

            <artifactId>order-service</artifactId>
            <packaging>war</packaging>

            <properties>
                <maven.compiler.source>17</maven.compiler.source>
                <maven.compiler.target>17</maven.compiler.target>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            </properties>

            <dependencies>
                <!-- 继承父工程依赖版本 -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                </dependency>

                <!-- 继承父工程依赖版本 -->
                <dependency>
                    <groupId>org.apache.shiro</groupId>
                    <artifactId>shiro-core</artifactId>
                </dependency>
            </dependencies>

        </project>
        ```

user和order两个要依赖comment,则comment需要部署到本地仓库或私服,通过mvn install或mvn deploy部署后,在user和order的pom.xml文件中 <dependencies>的 <dependency>添加gav属性即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值