其实学会Maven很容易,带你快速了解Maven教程

Posted jiangxiaoju

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了其实学会Maven很容易,带你快速了解Maven教程相关的知识,希望对你有一定的参考价值。

在开始之前,请先确保你的电脑已经安装了jdk1.7或者以上版本,maven,以及IDEA或者eclipse

推荐教程:

文章目录

简介

Maven是什么?

Maven官网:https://maven.apache.org/

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。

Maven能做什么?

依赖管理

在没学习maven之前,如果你学过spring框架或者其他框架的时候,是不是通常得手动复制一大堆jar包到项目中。随着我们项目的不断扩大,模块越来越多,引入的jar也随之增多。这时候管理这些依赖就是一件很让人头疼的时,不同的jar包之间可能存在冲突或者版本之间不匹配等各种各样的问题。

而使用maven的话,我们可以事先将各种jar包放到一个仓库中,当项目中需要中使用的时候,只要通过pom.xml中的做表,到我们事先存放jar包的仓库中找到这些jar包,再用这些jar包去运行即可。

我们也可以通过pom.xml中的坐标去管理各个依赖之间的关系(这个后面会详细提到)。

项目构建

一个项目中,往往都要经历编译、测试、运行、打包、安装 ,部署等一系列过程。

maven可以帮我们管理这一系列过程。通过maven提供的命令就可以轻松搞定。

为什么要学Maven

  • 提高开发效率。

  • 现在开源的项目或者很多教程,都会使用到maven,不学的话,很难看懂别人的代码。

Maven工程

Maven工程的目录结构

首先我们先使用idea创建一个maven工程(不知道怎么创建的话可以参考这里Maven环境配置以及IDEA使用maven创建项目)。

创建好后,会得到这么个一个目录

  • pom.xml:maven 项目核心配置文件。

  • src/main目录下就是存放跟我们项目相关的文件

    • src/main/java:存放项目*.java文件。
    • src/main/resources:存放项目的资源文件,例如spring、myabtis等配置文件。
    • src/test/java:存放测试用的*.java文件。
    • src/test/resources:测试资源文件
  • target:项目输出位置,编译好的.class文件会输出到这里

  • 如果是一个javaweb项目,在src/main目录下还会有一个webapp目录,用于放置网页文件等

Maven概念模型——POM(Project Object Model)

创建好maven工程后,打开pom文件,一般会出现以下内容。(idea上不同方式创建,多少会有些不同)

Maven 包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

  • 项目对象模型

    一个 maven 工程都有一个 pom.xml 文件,通过 pom.xml 文件定义项目的坐标、项目依赖、项目信息、

    插件目标等;例如定义自己项目中的一些信息。

    • groupId:项目名称
    • artifactId:模块名称
    • version:版本信息
        <groupId>org.example</groupId>
        <artifactId>test</artifactId>
        <version>1.0-SNAPSHOT</version>
    
  • 依赖管理系统

    通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理。

    比如:项目依赖 junit4.9,通过在 pom.xml 中定义 junit4.9 的依赖即使用 junit4.9,如下所示是 junit4.9

    的依赖定义:

        <dependencies>
            <!-- 此项目运行使用 junit,所以此项目依赖 junit -->
            <dependency>
                <!-- junit 的项目名称 -->
                <groupId>junit</groupId>
                <!-- junit 的模块名称 -->
                <artifactId>junit</artifactId>
                <!-- junit 版本 -->
                <version>4.13</version>
                <!-- 依赖范围:单元测试时使用 junit -->
                <scope>test</scope>
            </dependency>
        </dependencies>
    
  • 一个项目生命周期(Project Lifecycle)

    使用 maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven 将这些过程规范为一个生命周期。

  • 插件(plugin)目标(goal)

    maven 管理项目生命周期过程都是基于插件完成的。

POM文件中各个标签的详细介绍

这里记录下常用的标签用法,若有缺漏,欢迎评论区留言,我看到了会及时补上。

可以先看之后的内容,再回过头来看这部分。

modelVersion

描述这个pom文件遵循哪个版本的项目描述符

    <modelVersion>4.0.0</modelVersion>

parent

父级依赖,继承哪个pom项目

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

groupId、artifactId、version

  • groupId:项目名称
  • artifactId:模块名称
  • version:版本信息
    <groupId>org.example</groupId>
    <artifactId>test</artifactId>
    <version>1.0-SNAPSHOT</version>

packaging

定义项目的打包方法。可选值有:pom、jar、war、maven-plugin

<packaging>jar</packaging>

properties

在properties可以自定义一些属性值

    <properties>
        <junit.version>4.13</junit.version>
    </properties>

使用的方法如下

    <properties>
        <junit.version>4.13</junit.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>$junit.version</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

dependencies、dependence

  • dependencies:里面包含多个dependence

如果要查询某些依赖作标,可以到这个网站上http://www.mvnrepository.com/

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

exclusions、exclusion

当某个依赖重复导入时,可以用exclusions排除项目中的某个依赖。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

scope

依赖范围有四种

  • compile
  • test
  • runtime
  • provided
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

dependencyManagement

在父工程中使用。如果在子工程中没有定义依赖版本,就默认使用父工程这里定义的。

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

Maven仓库

maven项目运行的时候会通过pom.xml文件中的依赖作标引入一些依赖jar包,首先会现到本地区寻找,如果有的话,则直接引入,若没有的话,则从远程仓库下载(联网下载),然后保存到本地,之后再使用的话,直接引用本地的就行。

maven仓库分为三类:

  • 本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找。默认本地仓库的位置为$user.dir/.m2/repository,$user.dir也就是window用户目录。这个可以通过修改maven/conf下的settings.xml文件来设置。
  • 远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。
  • 中央仓库 :在 maven 软件中内置一个远程仓库地址 http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件。

Maven常用命令

compile

compile是maven工程的编译命令。可以把src/main/java中的java文件编译成class文件输出到targe目录下。使用方法如下图

test

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

使用方法如下。

clean

clean是maven工程的清除命令,执行后会删除targe目录

package

package是maven工程的打包命令,根据\\<packaging\\>的内容打包成jar包或者war包。

mvn package

install

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

mvn install

Maven指令的生命周期

maven 对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,

这三套生命周期分别是:

Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。

Site Lifecycle 生成项目报告,站点,发布站点。

maven指令有以下这些,当执行某个指令后,会把它之前的指令也执行一次。例如执行test指令的话,也会执行clean、compile。

Maven项目的依赖

什么是传递依赖

现在项目中加入父标签

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

然后加入spring-boot-starter-web坐标

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

然后使用idea的工具来查看下项目的依赖结构

会发现除了引入的spring-boot-starter-web之外,还有其他jar包存在。因为我们项目依赖了spring-boot-starter-web,而spring-boot-starter-web也以来了tomcatspring-webmvc等。所以它们也出现在了我们项目中。这就是传递依赖。

依赖冲突

依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。

依赖冲突的解决

因为依赖传递等原因把某一个jar包的不同版本都引入到了项目中。我们可以选择保留某一版本的依赖。使用<exclusions>把依赖排除掉

到此,本文就此结束。希望能帮助你快速了解并使用maven。

拒绝白嫖,从点一键三连做起。

以上是关于其实学会Maven很容易,带你快速了解Maven教程的主要内容,如果未能解决你的问题,请参考以下文章

快速学习Maven项目构建绽放本真的天赋两场Chat | 新知 · 预报

手把手教你学会希尔排序,很简单!

手把手教你Maven构建过程

快速上手ssm项目

带你十分钟快速构建好 SpringBoot + SSM 框架

了解JavaWeb开发的技术栈从掌握Tomcat的使用开始,手把手带你用Maven创建web项目