zl程序教程

您现在的位置是:首页 >  Java

当前栏目

Maven使用与学习

2023-03-31 11:01:44 时间

Maven使用与学习

一、Maven是什么

  • maven像是一种管理的工具,实现的原理是使用插件。比如说,一个公司需要做一个项目,这个项目被分成了很多模块,每个模块又分成了许多的业务,这些最后都需要整合到一起。那么就会出现一个很大的问题,在项目开发中每个人使用的jar包版本、软件版本等如果不一样的话,就算单个模块可以执行,一旦整合就会出现各种各样的问题。那么如何避免这些问题或者最大程度上减少这种情况发生呢?那么就要用到maven。它更像是每个开发者从网上的一个中央仓库获取到开发所需要的jar包,并且可以把自己完成的项目打包发布到这个仓库中,供其他开发人员使用,同时项目经理可以统一开发所需要的版本、jar包等,最大程度上减少这种非技术问题的情况发生。

  • Maven 字面意思:专家、内行

  • Maven是一款自动化构建工具,专注服务于Java平台的项目构建依赖管理

  • 依赖管理:jar之间的依赖关系,jar包管理问题统称为依赖管理

  • 项目构建:项目构建不等同于项目创建

    • 项目构建是一个过程【7步骤组成】,项目创建是瞬间完成的
      1. 清理:mvn clean
      2. 编译:mvn compile
      3. 测试:mvn test
      4. 报告:
      5. 打包:mvn package
      6. 安装:mvn install
      7. 部署:

二、为什么使用maven

1.获取jar包

  • 使用Maven之前,自行在网络中下载jar包,效率较低。如【谷歌、百度、CSDN....】
  • 使用Maven之后,统一在一个地址下载资源jar包【阿里云镜像服务器等...】

2.添加jar包

  • 使用maven之前,将jar复制到项目文件中,相对浪费存储空间

  • 使用maven之后,jar包统一存储到Maven本地仓库,使用坐标方式把jar包引入到项目中

3.使用maven便于解决jar包冲突及依赖问题

三、Maven的POM

POM:Project Object Model【项目对象模型】,将项目封装为对象模型,便于使用Maven管理【构建】项目

pom.xml:是maven的核心配置文件,一个maven项目有且只有一个

四、Maven的目录结构

  • 项目名

    • src【书写java源代码】

      • main【书写java主程序代码】

        • java【书写java代码】
        • resources【书写配置文件代码】
      • test【书写测试代码】

        • java【书写测试java代码】
      • pom.xml【书写配置文件代码】

      • target【编译后目录结构】

五、Maven的生命周期

Maven生命周期:按照顺序执行各个命令,Maven生命周期包含以下三个部分组成

  • Clean LifeCycle:在进行真正的构建之前进行一些清理工作。
  • Default LifeCycle:构建的核心部分,编译,测试,打包,安装,部署等等。
  • Site LifeCycle:生成项目报告,站点,发布站点。

image-20220810104908659

六、Maven的插件和目标

  • 插件:本质上由jar包和配置文件组成
  • 目标:每个插件都能实现多个功能,每个功能就是一个插件目标。

七、Maven的仓库【重要】

  • 仓库分类
    • 本地仓库:为当前计算机提供maven服务
    • 远程仓库:为其他计算机也可以提供maven服务
      • 私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。
      • 中央仓库:架设在Internet上,为全世界所有Maven工程服务。
      • 中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。
  • 仓库中的文件类型【jar包】
    • Maven的插件
    • 第三方框架或工具的jar包
    • 自己研发的项目或模块

八、Maven的坐标【重要】

  • 作用:使用坐标引入jar包

  • 坐标由g-a-v组成

    [1]groupId:公司或组织的域名倒序+当前项目名称

    [2]artifactId:当前项目的模块名称

    [3]version:当前模块的版本

  • 注意

    • g-a-v:本地仓库jar包位置
    • a-v:jar包全名
  • 坐标应用

<dependency>
            <groupId>com.shujia</groupId>
       		<artifactId>mysql-demo2</artifactId>
           	<version>1.0-SNAPSHOT</version>
</dependency>

九、依赖范围

依赖语法:<scope>

  • compile【默认值】:在main、test、Tomcat【服务器】下均有效。
  • test:只能在test目录下有效
    • junit
  • provided:在main、test下均有效,Tomcat【服务器】无效。
    • servlet-api

十、依赖的传递性

  • 路径最短者优先【就进原则】
  • 先声明者优先
  • 注意:Maven可以自动解决jar包之间的依赖问题

十一、Maven统一版本号

语法:

<properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <hadoop-version>2.7.6</hadoop-version>
    </properties>

        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop-version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop-version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop-version}</version>
        </dependency>


    </dependencies>

十二、Maven的继承

第一种方式

  • 在父工程中的pom.xml中导入jar包,在子工程中统一使用。【所有子工程强制引入父工程jar包】

    • 父工程pom.xml依赖
    <dependencies>
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.49</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>${hadoop-version}</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>${hadoop-version}</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>${hadoop-version}</version>
            </dependency>
    
    
        </dependencies>
    
    

    子过程不写任何依赖,自动引入父工程所有的包

    image-20220810111817923

第二种方式

使用 管理父工程的依赖

 <dependencyManagement>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.49</version>
            </dependency>

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>${hadoop-version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>${hadoop-version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>${hadoop-version}</version>
            </dependency>

在子工程引入父工程的相关jar包

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

注意:在子工程中,不能指定版本号

十三、 Maven的聚合

为什么使用Maven的聚合

  • 优势:只要将子工程聚合到父工程中,就可以实现效果:安装或清除父工程时,子工程会进行同步操作。
  • 注意:Maven会按照依赖顺序自动安装子工程