重学Maven工具(一) : Maven基础知识、安装优化配置、IDEA创建Maven、生命周期和常用命令、插件介绍


一、 Maven概述

1.1 Maven的概念

Maven是Apache下一个纯Java开发的开源项目,它是一个跨平台的项目管理工具,即针对Java平台的项目构建和依赖的管理。

项目构建 :

我们首先要区别的是,项目构建并不是项目创建的意思,项目创建只是一个工程的创建过程,而项目构建过程包括:【清理→编译→测试→报告→打包→部署】这几个步骤,这六个步骤就是一个项目的完整构建过程。

在这里插入图片描述

依赖管理 :

依赖指的是项目与jar包之间的相互依赖,比如我们在使用Spring框架的时候,需要用到Spring依赖的jar包。而依赖管理指的就是使用Maven来管理项目中使用到的jar包,Maven管理的方式就是“自动下载项目所需要的jar包,统一管理jar包之间的依赖关系”。比如在文件上传的时候,光光有common-fileupload这个jar包是不行的,common-fileupload还依赖于common-io这个包jar包,此时由于Maven的依赖管理机制,都会帮我们自动下载这些包,我们并不需要管。

1.2 Maven的作用

为什么使用Maven我们首先得去分析传统项目管理的缺陷有哪些:

  • jar包需要我们自己去网上下载,非常的麻烦,而且有些jar包根本找不到。
  • 如果某个jar需要依赖其它jar包的话,还需要去找依赖的jar包,而且很有可能我们漏掉了某个依赖关系,就会导致项目运行报错。
  • 没有对jar包的版本统一管理,容易导致版本冲突。
  • 传统的一个项目就是一个工程。如果项目比较庞大,那么利用包名来划分模块,显然容易造成混淆而且不利于分工合作。
  • 传统项目的部署和迁移不方便,容易出现错误。

根据以上缺陷便可以总结出使用Maven的好处:

  • 避免四处找jar包, 通过maven引入对应依赖,就自动去仓库下载。
  • 消除Jar包之间的相互依赖。
  • 避免Jar包冲突
  • 项目拆分多个模块。
  • 项目的步署和迁移方便,甚至分步式部署也很方便。

1.3 Maven的概念模型

  • 项目对象模型 (Project Object Model)。POM对象模型,每个maven工程中都有一个pom.xml文件,定义工程所依赖的jar包、本工程的坐标、打包运行方式。

  • 依赖管理系统(基础核心 ), maven通过坐标对项目工程所依赖的jar包统一规范管理。

  • maven 管理项目生命周期过程都是基于插件完成的,例如:开发中使用的tomcat插件。

1.4 Maven的仓库

Maven的仓库,就指的就是存放jar包的地方。 在Maven中的仓库分为三个类型,它们分别为:本地仓库、远程仓库和中央仓库。其实远程仓库它包含了中央仓库,私服,和其他公共库。

仓库名称作用
本地仓库相当于缓存,工程第一次会从远程仓库(互联网)去下载jar 包,将jar包存在本地仓库(在程序员的电脑上)。第二次不需要从远程仓库去下载。先从本地仓库找,如果找不到才会去远程仓库找(我们使用的是阿里巴巴的远程仓库)。
中央仓库就是远程仓库,仓库中jar由专业团队(maven团队)统一维护。
远程仓库在公司内部架设一台私服,其它公司架设一台仓库,对外公开。

在这里插入图片描述
Maven下载jar包的优先级:

  • ①、如果本地仓库有,就从本地仓库里拿。
  • ②、如果本地仓库没有,就从私服拿,顺便下载一份到本地仓库(如果有私服的话)。
  • ③、如果私服没有,判断是否配置了镜像,如果配置了镜像,就去镜像那儿拿,如果没有没有配置镜像,就从中央仓库那拿。
  • ④、如果中央仓库也没有,就抛出异常,坐标不对。

所以, Maven的各个仓库的优先级是:本地仓库 > 私服 > 远程仓库

1.5 Maven的坐标

Maven的一个核心的作用就是管理项目的依赖,引入我们所需的各种jar包等。为了能自动化的解析任何一个Java构件,Maven必须将这些Jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是我们要说的坐标。包括我们自己开发的项目,也是要通过坐标进行唯一标识的,这样才能才其它项目中进行依赖引用。坐标的定义元素如下:

  • groupId:公司或组织域名倒序
  • artifactId:模块名
  • version:版本号

构成了一个Jar包的坐标(简称gav)

例如:要引入junit的测试jar,只需要在pom.xml配置文件中配置引入junit的坐标即可:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.26</version>
    
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.0.9.RELEASE/</version>
</dependency>

二、 Maven的安装和优化配置

2.1 下载Maven

Maven的下载地址为:https://maven.apache.org/download.cgi

点击apache-maven-3.6.3-bin.zip下载。这里当然选择的是最新的版本,下载成功之后,在电脑上解压。

解压后的文件目录如下所示:
在这里插入图片描述
下面介绍一下各个文件的作用:

  • bin目录:包含 maven运行时的脚本, 这些脚本用来配置Java命令,准备好 classpath和相关的java系统属性。 其中:mvn 是UNIX平台的
  • shell脚本, mvn.cmd 是Windows平台的 bat脚本, mvcDebug 是UNIX的调试脚本, mvcDebug.cmd 是Windows平台的 调试脚本。
  • boot目录:包含两个文件。 其中plexus-classworlds-2.6.0.jar ,是一个类加载器框架。Maven可以使用它,来加载自己的类库。
  • conf目录:是配置文件目录,其中有一个 settings.xml 文件,用来配置maven。还有一个 logging文件,日志记录,来配置日志的相关信息。
  • lib目录:maven运行时,所需要的类库。 里面放置了大量的 .jar 类库及对应的软件许可证 .license.
  • LICENSE:Maven使用的软件许可证。
  • NOTICE:Maven包含的第三方软件
  • README.txt:Maven的简单介绍,包括安装需求和安装的简要指令。

2.2 配置环境变量

注意:Maven是依赖于JDK的,所以我们在安装 Maven之前,电脑上必须先安装 JDK。

首先右击此电脑—>属性—>高级系统设置—>高级—>环境变量。

在这里插入图片描述
①、新建系统变量:MAVEN_HOME。变量值:D:\Maven\apache-maven-3.6.3(这是你Maven的存储路径)
在这里插入图片描述
②、编辑系统变量:Path。添加变量值:%MAVEN_HOME%\bin。其中“%MAVEN_HOME%\bin”代表的就是”D:\Maven\apache-maven-3.6.3\bin“目录。
在这里插入图片描述
③、检验配置是否成功:用win键+R,输入cmd进入dos命令,输入mvn -v,出现如下信息则表明成功!
在这里插入图片描述

2.3 Maven优化(setting配置)

①、修改本地仓库位置。

Maven管理的jar包默认是存储在C盘用户目录下的 .m2 下的repository中。
在这里插入图片描述
可以更改maven的位置:

首先我们找到解压的Maven文件,然后打开conf目录下的setting.xml。

大概在55行左右我们加入如下配置文件:

<localRepository>D:/Maven/maven-repository</localRepository>

在这里插入图片描述
②、修改镜像源。

Maven默认下载jar包是从中央仓库下载的,所以我们在国内下载jar包是非常非常的慢,所以我们需要改一下,这里推荐阿里云的仓库。

大概在setting.xml中的第159行左右我们加入如下配置文件:

<mirror>
    <id>nexus-aliyun</id>
    <name>nexus-aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    <mirrorOf>central</mirrorOf>
</mirror>

③、修改Maven默认的JDK版本。
自己电脑上安装的什么版本的JDK我们就设置对应的JDK版本就可以了。

大概在setting.xml中的第218行左右我们加入如下配置文件:

<profile>
    <id>jdk-1.8</id>
    <activation>
        <jdk>1.8</jdk>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
</profile>

三、 IDEA创建Maven工程

此过程比较简单, 参考链接 : IDEA搭建Maven工程

四、 Maven的生命周期和常用命令

4.1 Maven的生命周期

Maven的生命周期就是对所有的构建过程进行抽象和统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。

Maven有三套相互独立的生命周期,分别是clean、default和site。其中每个生命周期都包含一些阶段(phase),阶段是按顺序执行的,且后面的阶段依赖于前面的阶段。执行某个阶段时,其前面的阶段会依顺序执行,但不会触发另外两套生命周期中的任何阶段。

Maven的三套生命周期:

  • clean生命周期(项目清理生命周期):对在进行构建之前进行的一些清理工作。clean
  • default生命周期(默认生命周期):构建的核心部分,编译、测试、打包、安装、部署等等。compile test package install deploy
  • site生命周期(生成站点生命周期):生成项目报告,站点,发布站点。site

注意:由于这三个阶段的生命周期都是相互独立的,所以不能看成一个整体。但可以同时直接运行 mvn clean install site 这三套生命周期。

因为Maven的生命周期是抽象的,所以生命周期不做任何实际的工作,实际任务由插件来完成。

Default生命周期(Default Lifecycle)

Default Lifecycle是构建的核心部分,编译,测试,打包,部署等等,Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中

在这里插入图片描述

注意:在一个生命周期中,当运行某个阶段的时候,它之前的所有阶段都会被运行,而且不需要额外去输入前面的阶段。下面举例说明一下:

①、执行mvn clean:调用clean生命周期的clean阶段,实际执行pre-clean和clean阶段。

②、执行mvn test:调用default生命周期的test阶段,实际执行test以及之前所有阶段。

③、执行mvn clean install:调用clean生命周期的clean阶段和default的install阶段,实际执行pre-clean和clean,install以及之前所有阶段。

然后下面举第②个例子:执行mvn test。
在IDEA中执行test命令:

在这里插入图片描述

前面说了Maven的命令是有各自对应的插件去完成。我们看到红色框的部分,有三个不同类型的Plugin。第一个maven-resources-plugin:3.0.2是用来处理资源文件的,第二个maven-compiler-plugin:3.8.0是用来编译文件的。第三个maven-surefire-plugin:2.22.1是用来测试文件的。它们的具体会在后面介绍。

4.1 常用命令

通过上面对maven的生命周期的分析,可以总结出maven中常用的命令有:clean、compile、test、package、install。所以下面我们讲讲这几个常用的 Maven 命令。首先我们先创建一个Maven项目。并且在里面添加一些代码用来测试。

在这里插入图片描述

在 src/main/java新建类 HelloMaven.java:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HelloMaven {
    
    private String name;
    private Integer age;
}

在 src/test/java新建中创建测试类 TestMaven.java

public class TestMaven {

    @Test
    public void testMaven() {
        HelloMaven hm = HelloMaven.builder().name("lucky").age(24).build();
        System.out.println(hm);
    }
}

pom.xml 文件引入JUnit依赖如下:

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

clean

将之前编译的文件删除。

我们首先运行一下程序,让它生成target文件。
在这里插入图片描述
然后再运行clean命令。在IDEA的右侧栏找到Maven Projects(如果没有则在菜单栏找到View—>第一行Tool Windows—>Maven Projects)。

在这里插入图片描述
双击clean命令
这时,控制台打印输出:
在这里插入图片描述
这时,再看一下工作空间,target文件夹被删除了。

compile

编译项目,并将编译的文件放在target目录

双击compile命令。这时,控制台打印输出:

在这里插入图片描述
再看一下工作空间,生成了 target文件夹。

点击 target文件夹, 不仅仅有 classes文件夹,里面放置包名/HelloMaven.class ,还生成了其他的文件夹。

在这里插入图片描述

test

使用单元测试框架运行测试代码(编写在test包中的代码)

双击test命令。这时,控制台打印输出:

在这里插入图片描述

再看一下工作空间,target 除了刚才的那些文件夹之外,又添加了几个。 test-classes,,里面放置了 包名/HelloTest.class。

在这里插入图片描述

package

对项目进行打包,放在target目录中

双击package命令。这时,控制台打印输出:

在这里插入图片描述
再看一下工作空间,target 除了刚才的那些文件夹之外,又多了一个 项目名-版本-快照.jar包。

在这里插入图片描述

install

将包安装至本地仓库,以让其它项目依赖

双击install命令。这时,控制台打印输出:
在这里插入图片描述

再看一下工作空间,target 相对于package来说,没有任何改变。 改变的是本地仓库。根据红框的地址找到我们安装的jar包:D:\Maven\maven-repository\com\thr\hellomaven\1.0-SNAPSHOT。里面有 jar包和相应的 pom.xml 文件,只是pom.xml 的名称变成了 jar包名.pom。

在这里插入图片描述

五、 Maven插件介绍

Maven生命周期是依靠各种插件来完成的,而我们打开Maven的源文件并没有发现有plugin,这是因为我们在第一次使用Maven的时候它会给我们自动下载,还记得在第一次配置并且运行Maven项目的时候,加载的时间有点长,输出界面也一直在下载东西,此时就在下载我们的插件。所以我们是可以找的下载的插件的,定位到:%本地仓库%\org\apache\maven\plugins,可以看到一些下载好的插件:

在这里插入图片描述
①、插件的目标(Plugin Goals)

一个插件通常可以完成多个任务,每一个任务就叫做插件的一个目标。如执行mvn compile命令时,此时的 compile 就是一个目标,调用的插件和执行的插件目标如下:

在这里插入图片描述

②、插件如何与生命周期进行绑定?

插件与生命周期绑定是通过将插件的目标(goal)绑定到生命周期的具体阶段(phase)来完成的。如:将maven-compiler-plugin插件的compile目标绑定到default生命周期的compile阶段,完成项目的源代码编译:

在这里插入图片描述

③、内置的绑定

Maven对一些生命周期的阶段(phase)默认绑定了插件目标,因为不同的项目有jar、war、pom等不同的打包方式,因此对应的有不同的绑定关系,其中针对default生命周期的jar包打包方式的绑定关系如下:

在这里插入图片描述

第三列中【插件:目标】,其中冒号后面即是绑定的插件目标,冒号前面是插件的前缀(prefix),是配置和使用插件的一种简化方式。详细可查看Maven官方文档:Plugin Prefix

④、自定义绑定

用户可以根据需要将任何插件目标绑定到任何生命周期的阶段,如:将maven-source-plugin的jar-no-fork目标绑定到default生命周期的package阶段,这样,以后在执行mvn package命令打包项目时,在package阶段之后会执行源代码打包。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.2.1</version>
            <executions>
                <execution>
                    <id>attach-source</id>
                    <phase>package</phase><!-- 要绑定到的生命周期的阶段 -->
                    <goals>
                        <goal>jar-no-fork</goal><!-- 要绑定的插件的目标 -->
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    ……
</build>

在插件元素中,元素是执行目标,元素代表的是绑定的生命周期的阶段,元素代表要绑定的插件的目标。 插件是前面artifactId中定义好的,goals相当于该插件中的一个功能,该功能将在phase绑定的生命周期阶段执行。这种方式就属于自定义绑定,即在某个特定的生命周期阶段执行某个插件的功能,此时大多数时候是内置绑定的。

⑤、配置插件

Maven插件高度易扩展,可以方便的进行自定义配置。如:配置maven-compiler-plugin插件编译源代码的JDK版本为1.7:

<!-- 编译插件 --> 
<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-compiler-plugin</artifactId>
     <configuration>
         <source>1.7</source>
         <target>1.7</target>
         <encoding>UTF-8</encoding>
     </configuration>
 </plugin>
  • source: 源代码编译版本;
  • target: 目标平台编译版本;
  • encoding: 字符集编码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white camel

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值