欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Maven基础知识大梳理

程序员文章站 2022-03-25 14:56:49
目录maven工程基础知识maven仓库的分类maven常用命令的含义解决依赖冲突-使用mavenhelpermaven工程基础知识 maven 工程中不直接将 jar 包导入到工程中,而是通过在 p...

maven工程基础知识

       maven 工程中不直接将 jar 包导入到工程中,而是通过在 pom.xml 文件中添加所需 jar包的坐标,这样就很好的避免了 jar 直接引入进来,在需要用到 jar 包的时候,只要查找 pom.xml 文件,再通过 pom.xml 文件中的坐标,到一个专门用于”存放 jar 包的仓库”(maven 仓库)中根据坐标从而找到这些 jar 包,再把这些 jar 包拿去运行。

       为了解决这个过程中速度慢的问题,maven 中也有索引的概念,通过建立索引,可以大大提高加载 jar 包的速度

maven仓库的分类

本地仓库 :用来存储从远程仓库或*仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找

远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载(私服)。

*仓库:在 maven 软件中内置一个远程仓库地址 ,它是*仓库,服务于整个互联网。

maven常用命令的含义

    compile:编译--- compile 是 maven 工程的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target目录下。

    clean:清理--- clean 是 maven 工程的清理命令,执行 clean 会删除 target 目录及内容。

    test:测试--- test 是 maven 工程的测试命令 mvn test,会执行 src/test/java 下的单元测试类。

    package:打包---package 是 maven 工程的打包命令,对于 java 工程执行 package 打成 jar 包,对于 web 工程打成 war包。

    install:安装--- install 是 maven 工程的安装命令,执行 install 将 maven 打成 jar 包或 war 包发布到本地仓库

一个项目生命周期

Maven基础知识大梳理

打包类型:<packaging >

jar:执行 package 会打成 jar 包

war:执行 package 会打成 war 包

pom :用于 maven 工程的继承,通常父工程设置为 pom

依赖范围:<scope>

a 依赖 b,需要在 a 的 pom.xml 文件中添加 b 的坐标,添加坐标时需要指定依赖范围,依赖范围包括:

compile:compile指 a 在编译时依赖 b,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。

provided:provided 依赖只有在当 jdk 或者一个容器已提供该依赖之后才使用, provided 依赖在编译和测试时需要,在运行时不需要,比如:servlet api 被 tomcat 容器提供。

runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。

test:test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,比如:junit。由于运行时不需要所以 test范围依赖不会被打包。

system:system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 jar文件的路径,需要指定 systempath 磁盘路径,system依赖不推荐使用。

依赖范围由强到弱的顺序是:compile>provided>runtime>test

Maven基础知识大梳理

pom文件中常用标签的含义

<?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>
 <!--声明项目描述符遵循哪一个pom模型版本。4.0.0-->
 
    <groupid>com.tfjybj</groupid>
    <artifactid>super</artifactid>
    <packaging>pom</packaging>
    <version>1.0.0-snapshot</version>
    
    <!--项目的名称, maven产生的文档用-->
    <name>super</name>
    <!-- 项目的详细描述, maven 产生的文档用。-->
    <description>super</description>
 
    <!--聚合  来管理同个项目中的其他模块-->
    <modules>
        <module>super-common</module>
        <module>super-gateway</module>
        <module>super-zipkin</module>
        <module>super-provider</module>
        <module>super-provider-api</module>
    </modules>
 
    <!--继承  说明这是一个boot工程-->
    <parent>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-parent</artifactid>
        <version>2.1.8.release</version>
    </parent>
 
 
    <!--统一管理jar包版本-->
    <properties>
        <!--项目编码方式,maven编译版本-->
        <project.build.sourceencoding>utf-8</project.build.sourceencoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
          <!--统一管理jar包版本-->
        <spring.cloud.version>2.1.0.release</spring.cloud.version>
        <spring.boot.version>2.1.8.release</spring.boot.version>
        <mysql.version>6.0.6</mysql.version>
    </properties>
 
    <!--统一管理版本号-->
    <!--在父工程pom文件中声明依赖,但不引入,父项目声明,供子项目按需引入-->
    <dependencymanagement>
        <dependencies>
            <!-- nacos服务注册/发现-->
            <dependency>
                <groupid>com.alibaba.cloud</groupid>
                <artifactid>spring-cloud-starter-alibaba-nacos-discovery</artifactid>
                <version>${spring.cloud.version}</version>
                 <!--排除ribbon的依赖-->
               <exclusions>
                   <exclusion>
                       <groupid>org.springframework.cloud</groupid>
                       <artifactid>spring-cloud-starter-netflix-ribbon</artifactid>
                    </exclusion>
                </exclusions>
            </dependency>
            <!--nacos配置中心来做配置管理-->
            <dependency>
                <groupid>com.alibaba.cloud</groupid>
                <artifactid>spring-cloud-starter-alibaba-nacos-config</artifactid>
                <version>${spring.cloud.version}</version>
            </dependency>
             <!--mysql-->
            <dependency>
                <groupid>mysql</groupid>
                <artifactid>mysql-connector-java</artifactid>
                <version>${mysql.version}</version>
               <!--  mysql依赖的作用范围-->
                <scope>runtime</scope>
            </dependency>
           
        </dependencies>
    </dependencymanagement>
 
    <!--所有声明在父项目 dependencies 中的依赖都会自动引入,并默认被所有子项目继承-->
    <!--即使在子项目中不引入该依赖,那么子项目依然会从父项目中继承该依赖项。-->
    <dependencies>
 
    </dependencies>
 
    <!--发现依赖和扩展的远程仓库列表  -->
    <!--远程仓库列表,它是maven用来填充本地仓库所使用的一组远程项目。 -->
    <repositories>
        <!--包含需要连接到远程仓库的信息-->
        <repository>
            <id>spring-milestones</id>
            <name>spring milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>
 
    <!--用于项目打包,打包需要的插件-->
     <build>
        <plugins>
            <plugin>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-maven-plugin</artifactid>
            </plugin>
        </plugins>
    </build>
 
</project>

聚合与继承的关系

     1、聚合主要是为了方便快速构建项目,继承主要是为了消除重复配置

  2、对于聚合模块而言,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在;对于继承的父pom 而言,它不知道有哪些子模块继承它,但那些子模块都必须知道自己的父pom 是什么

  3、聚合pom 与继承中的父pom 的 packaging 都必须是 pom;同时,聚合模块与继承中的父模块除了 pom 外,都没有实际的内容

依赖冲突

         maven的依赖机制会导致jar包的冲突。

          举个例子,现在你的项目中,使用了两个jar包,分别是a和b。现在a需要依赖另一个jar包c,b也需要依赖c。但是a依赖的c的版本是1.0,b依赖的c的版本是2.0。这时候,maven会将这1.0的c和2.0的c都下载到你的项目中,这样你的项目中就存在了不同版本的c,这时maven会依据依赖路径最短优先原则,来决定使用哪个版本的jar包,而另一个无用的jar包则未被使用,这就是所谓的依赖冲突。

依赖调节原则

1.第一声明者优先原则

在pom文件定义依赖,以先声明的依赖为准。

谁先在pom.xml中申明,就用谁的。跟坐标代码的顺序有关

2.路径近者优先原则

Maven基础知识大梳理

以上两个jar包都依赖了spring-beans。

spring-context和spring-webmvc都会传递过来spring-beans,那如果直接把spring-beans的依赖写在pom文件中,那么项目就不会再使用其他依赖传递过来的spring-beans。

因为自己直接在pom中定义spring-beans要比其他依赖传递过来的路径要近。

3.排除依赖原则

使用maven中的<exclusions>标签,例如

     <!--使用的openfeign-->
     <dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-starter-openfeign</artifactid>
            <version>2.2.1.release</version>
            <exclusions>
                 <exclusion>
                     <groupid>org.springframework.cloud</groupid>
                     <artifactid>spring-cloud-starter-netflix-ribbon</artifactid>
                 </exclusion>
            </exclusions>
     </dependency>

4.锁定版本原则

面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。

解决依赖冲突-使用mavenhelper

在idea中下载插件mavenhelper解决依赖冲突,使用步骤看图

Maven基础知识大梳理

Maven基础知识大梳理

找到冲突,点击右键,然后选择exclude即可排除冲突版本的jar包。

以上就是maven基础知识大梳理的详细内容,更多关于maven基础知识的资料请关注其它相关文章!

相关标签: Maven