maven学习

MVN_Day01


maven概述

maven可以理解为一种管理工具,实现的原理是使用插件。

举个例子,比如说,一个公司需要做一个项目,这个项目又分成了很多的模块,每个模块又分成了许多的业务等等,这些需要许许多多的小组进行进行,最后再进行整合。

那么,就有一个很大的问题,IT技术发展这么快的时代里,每个人使用的jar包版本,使用的软件版本,等等,如果不一样的话,就算单个小模块可以进行,一旦整合就会出现各种各样的问题,那么如何避免或者说,尽量的最大程度上减少这种情况发生呢?

那就要用到Maven了,它更像是每一个开发者从网上的一个中央仓库中获取到开发所指定需要的jar包,并且也可以把自己完成的项目打包成一个jar包发布到这个中央仓库中,供其他的模块开发人员使用,同时,项目经理等管理员,可以统一开发所需要的版本,最大程度上减少这种非技术问题的情况发生。


为什么使用maven

  • 获取jar包

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

    • 使用Maven之前,将jar复制到项目工程中,jar包添加到项目中,相对浪费存储空间

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

    • 使用Maven便于解决jar包冲突及依赖问题


什么是maven

  • Maven字面意:专家、内行

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

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

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

    • 项目构建是一个过程,项目创建是瞬间完成的

    • 在使用 Maven 进行项目构建时,一般可以分为以下几个步骤:

      1. 清理(Clean): 清除之前构建生成的输出文件。该步骤可选。
      2. 编译(Compile): 编译项目的源代码,将其转换为字节码文件。Maven会自动识别项目的依赖关系,并按照正确的顺序编译源代码。
      3. 测试(Test): 运行项目中的单元测试。Maven 使用测试框架(如 JUnit)执行项目中的测试用例。如果有任何测试失败,构建过程将停止。
      4. 打包(Package): 将项目的编译输出文件(如 JAR、WAR 或者其他格式)打包到目标格式中。Maven 根据项目类型和配置生成适当的构建产物。
      5. 安装(Install): 将构建生成的文件安装到本地 Maven 仓库中,以供其他项目进行依赖引用。这样,其他项目就可以在自己的配置文件中直接指定依赖关系来使用当前项目。
      6. 部署(Deploy): 将构建生成的文件复制到远程仓库,以供其他开发人员或团队成员使用。远程仓库可以是 Maven 仓库管理服务器(如 Nexus、Artifactory 等),也可以是版本控制系统(如 Git、SVN)。

      这些步骤是 Maven 构建过程中常见的几个阶段。Maven 通过脚本(pom.xml 配置文件)定义和控制这些阶段的执行顺序和具体行为。你可以根据项目的需要进行配置和自定义,以满足特定的构建需求。


安装和配置maven环境

  • 下载地址:https://maven.apache.org/index.html

3.6.3版本下载地址:https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/

  • Maven底层使用Java语言编写的,所以需要配置JAVA_HOME环境变量及Path
  • 将Maven解压非中文无空格目录下
  • 配置MAVEN_HOME环境变量及Path
  • 输入【cmd】,进入命令行窗口,输入**【mvn -v】** ,检查Maven环境是否搭建成功

链接:https://pan.baidu.com/s/1mE8k22lwUQJAd-GbQ3zzAg
提取码:twj0

  • 完成下载安装并且配置环境变量之后,打开安装目录下的conf文件下的sittings.xml文件,将文件中的做如下添加

    <mirror>
    	<id>alimaven</id>
    	<mirrorOf>*</mirrorOf>
    	<url>https://maven.aliyun.com/repository/central</url>
    </mirror>
    
  • 之后设置本地仓库,每个人的都不一样,在刚刚的site.xml文件中添加如下

    <localRepositroy>这里填写本地仓库路径</localRepositroy>
    

Maven以及IDEA相关的应用

  • 通过调整设置,将maven整合到idea中去,选择本机的maven安装路径,安装路劲下的sittings.xml文件,和之前设置好的maven仓库,override要勾选上

    在这里插入图片描述

  • 然后新建一个maven项目

    在这里插入图片描述

    其中要选择项目的名称,项目的路径,版本号可以直接填写1.0,下方的G-A-V用于定位到一个jar包,其中Version默认是上方的1.0加上一个SNAPSHOT,SNAPSHOT可以去掉不写,这个无所谓。

    • Maven 项目中的 groupId 由一组标识符组成,并且遵循反向域名的命名约定。通常,groupId 是用来唯一标识项目所属组织或团队的。

      具体而言,groupId 通常包含以下几个部分:

    • 顶级域名反转(Top-level Domain Reversed): 使用您的组织或团队的网站的顶级域名,并将其反转。例如,如果您的组织使用的是 example.com,则顶级域名反转后为 com.example

    • 子域名(Subdomains): 如果您的组织在顶级域名下使用了子域名,您可以将其添加到 groupId 中。例如,如果您的组织使用的是 subdomain.example.com,则子域名添加后为 com.example.subdomain

    • 项目名称(Project Name): 将项目的名称直接附加到 groupId 的末尾。这有助于确保唯一性,并使 groupId 更具可读性。例如,如果您的项目名称是 myproject,则最终的 groupId 可能为 com.example.myproject

    综上所述,Maven 项目的 groupId 可以根据组织的网站域名和项目名称来定义。这样做有助于确保全局唯一性,并使不同组织的项目更易于区分和管理。


    • Maven 项目中的 artifactId 是项目的唯一标识符,它由一组标识符组成。artifactId 用于唯一标识项目内部不同的构建产物。

      以下是 artifactId 通常由哪些组成部分:

    • 项目名称(Project Name): 将项目的名称直接作为 artifactId 的一部分。这有助于确保构建产物的唯一性,并使其更具可读性。例如,如果项目名称是 myproject,则 artifactId 可以是 myproject

    • 模块名称(Module Name): 如果项目是一个多模块项目,那么每个子模块可以有自己独特的 artifactId。子模块的 artifactId 可根据模块的功能或角色来命名。例如,如果有一个子模块负责数据库访问,那么它的 artifactId 可以是 myproject-dao

    综上所述,artifactId 主要由项目名称和可选的模块名称组成。它应该足够明确地标识项目的构建产物,并与其他项目区分开来。在 Maven 中,artifactId 结合了 groupIdversion,用于唯一确定特定的构建产物。


当maven项目创建完毕之后我们可以观察到src目录下由两个文件一个是main文件一个是test文件,main文件的下方是一个蓝色的java文件,用于编写代码将来可以打包放到其他地方去运行,test文件夹下是一个绿色的java用于编写测试代码,将来不会被打包

maven中约定的目录结构

  • 项目名
    • src【书写java源代码】
      • main【书写java主程序代码】
        • java【书写java代码】
        • resources【书写配置文件代码】
      • test【书写测试代码】
        • java【书写测试java代码】
    • pom.xml【书写配置文件代码】
    • target【编译后目录结构】

maven依赖管理的范围

依赖语法:<scope>

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

maven依赖的传递性

  • 父工程中的依赖,在子工程中可以被引用到

  • 子工程中的依赖在父工程中不能被引用到

  • 一旦在父工程中创建子工程,父工程中的java文件会变成灰色,如果要激活,就要去将该文件夹激活为Sources Root

    在这里插入图片描述


maven的生命周期

  • 在非maven项目中去创建java文件编译后的结果会放在一个橙色的out目录下,而在maven项目下编译的java文件结果会放在target目录下,点击clean会清除这个文件,clean单独作为一个生命周期,叫做Clean LifeCycle:在进行真正的构建之前进行一些清理工作。

  • 第二个生命周期叫做Default LifeCycle:构建的核心部分,编译,测试,打包,安装,部署等等。

    执行该生命周期的时候,如执行安装的时候会将编译,测试,打包都执行一遍,最终将打包好的jar包安装到maven仓库当中

  • 第三个生命周期叫做Site LifeCycle:生成项目报告,站点,发布站点。


maven工程引入jar包时,其他的jar包中包含本工程中的同样的依赖,但是版本不同,以谁的版本为准

以本工程中的依赖版本为准


maven工程引入jar包时,多个jar包中包含本工程中的同样的依赖,但是版本不同,以谁的版本为准

谁在前用谁的


以上两个问题总结为maven依赖的传递性

  • 路径最短者有先【就近原则】

  • 先声明者优先

  • 注意:Maven可以自动解决jar包之间的依赖问题


maven在开发中的标准写法

  • 父工程中properties配置中添加<hadoop.version>3.1.1</hadoop.version>,然后在下方的version中使用${hadoop.version}引用
  • 在父工程中使用将包在中间,这样可以让子工程可以有选择的使用父工程中的依赖,经过上述配置。子工程中导入依赖的时候不再需要指定版本号
<?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.shujia.xlj</groupId>
    <artifactId>bigdata-xlj</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>
    <modules>
        <module>maven-demo1</module>
        <module>maven-demo2</module>
        <module>maven-demo3</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <hadoop.version>3.1.1</hadoop.version>
        <junit.verison>4.12</junit.verison>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.verison}</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>3.1.1</version>
                <scope>${hadoop.version}</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>



</project>
<?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.shujia.xlj</groupId>
        <artifactId>bigdata-xlj</artifactId>
        <version>1.0</version>
    </parent>

    <artifactId>maven-demo1</artifactId>

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

    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
        </dependency>
    </dependencies>


</project>
<?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.shujia.xlj</groupId>
        <artifactId>bigdata-xlj</artifactId>
        <version>1.0</version>
    </parent>

    <artifactId>maven-demo2</artifactId>

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

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
        </dependency>
    </dependencies>

</project>
<?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.shujia.xlj</groupId>
        <artifactId>bigdata-xlj</artifactId>
        <version>1.0</version>
    </parent>

    <artifactId>maven-demo3</artifactId>

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

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
        </dependency>
    </dependencies>

</project>

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包全名
  • 坐标应用

    • 坐标参考网址:http://mvnrepository.com

    • 语法,示例

      <dependencies>
          <!-- https://mvnrepository.com/artifact/junit/junit -->
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.12</version>
      	    <scope>test</scope>
          </dependency>
      
          <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
      	<dependency>
         	 	<groupId>mysql</groupId>
          	<artifactId>mysql-connector-java</artifactId>
          	<version>5.1.49</version>
      	</dependency>
      
      
          <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
      	<dependency>
          	<groupId>redis.clients</groupId>
          	<artifactId>jedis</artifactId>
          	<version>4.0.1</version>
      	</dependency>
      
      </dependencies>
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值