Maven(保姆级全详)新手入门

Maven (项目管理工具)

简介

Maven 是一个项目管理工具,主要用于 Java 项目的构建、依赖管理和发布。

Maven 的主要功能有以下几点:

  1. 项目构建:Maven 可以帮助你自动地构建项目,包括编译代码、打包、测试等。
  2. 依赖管理:Maven 可以管理项目的依赖,包括依赖的 Jar 包、插件等。
  3. 发布:Maven 可以帮助你将项目发布到远程仓库,供其他人或项目使用。
  4. 报告生成:Maven 可以生成项目的报告,包括代码质量报告、测试报告等。

Maven 的主要优势在于,它能够解决项目依赖的问题,并且提供了一套标准的项目构建流程。使用 Maven 可以让你更加专注于代码的开发,而不用担心项目构建、依赖管理等方面的问题。

1、Meven介绍

Maven这个单词的本意是:专家,内行。读音是[’meɪv(ə)n]或[’mevn],不要读作“妈文”。

Maven 是一个项目管理和整合工具。作为Apache组织中的一个颇为成功的开源项目,Maven主要服务于Java平台的项目构建、依赖管理和项目信息管理。

  1. 在Javaweb开发中,需要使用大量的jar包,我们手动去导入;
  2. 如何能够让一个东西自动帮我导入和配置这个jar包。由此,Maven诞生了!

(1)问题1:jar包不统一,或jar包不兼容导致的问题;

image-20230218093926580

  1. 比如,我们开发了一个CRM系统(一般指客户关系管理系统),其肯定要用到一些jar包;比如用到了mybatis,log4j等;
  2. 除此之外,我们还能用到【我们同事,开发的一些东西】;比如,同事做了一个财务模块,我们就可能用到;
  3. 假设某天,项目的mybatis需要升级;升级后的mybatis要用5.0版本的Junit,但是,项目原先的Junit是4.0版本的;于是,意识到这个问题的我们,就会去手动升级Junit的版本;
  4. 那么,如果是同事做的那个财务模块升级了呐?那么,如果同事没有通知我们,我们还在这个CRM系统中用旧版本的财务模块;而这,可能导致问题;

(2)问题2:工程升级维护过程中,操作繁琐;

  • 我们把CRM项目开发完了,直接在开发环境打成一个jar包,发给运维,然后运维在生产环境运行即可?:显然不行;这是因为,开发环境和生产环境并不是完全一致的;
  • 我们在Windows上开发的代码,放到Linux系统上编译打包,大概率会出问题;(比如,String.getBytes()方法,在Windows和Linux上的结果就不一样)
  • 所以,一个正确的做法是:把源代码放到生产环境(一般是Linux系统)上,在生产环境中去测试、编译、打包、部署,才能确保OK;
  • 而很显然,在Linux上是不能安装我们开发时常用的IDEA这种图形界面的工具的;而这,就是操作繁琐的问题;

2、Maven能解决什么问题

我们知道,项目开发不仅仅是写写代码而已,期间会伴随着各种 必不可少的事情要做,下面列举几个感受一下:

  1. 我们需要引用各种 jar 包,尤其是比较大的工程,引用的 jar 包往往有几十个乃至上百个, 每用 到一种 jar 包,都需要手动引入工程目录,而且经常遇到各种让人抓狂的 jar 包冲突,版本冲突。
  2. 我们辛辛苦苦写好了 Java 文件,可是只懂 0 和 1 的电脑却完全读不懂,需要将它编译成二 进制字节码。好歹现在这项工作可以由各种集成开发工具帮我们完成,Eclipse、IDEA 等都可以将代 码即时编译。maven可以自动编译。
  3. 世界上没有不存在 bug 的代码,因此写完了代码,我们还要写一些单元测试,然后一个个的运行来检验代码质量。
  4. 再优雅的代码也是要出来盈利的。我们后面还需要把代码与各种配置文件、资源整合到一起,定型 打包,如果是 web 项目,还需要将之发布到服务器。

试想,如果现在有一种工具,可以把你从上面的繁琐工作中解放出来,能帮你构建工程,管理 jar 包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目,生成 Web 站 点,Maven 就可以解决上面所提到的这些问题。

maven的优点

  1. 添加第三方 jar 包

JavaEE 开发 。使用 jar 包最简单的方法就是复制粘贴到 WEB-INF/lib 目录下。但是这会导致每次创建一个新的工程就需要将 jar 包重复复制到 lib 目录下,从而造成工作区中存在大量重复的文件,让我们的工程显得很臃肿。

使用 Maven 后每个 jar 包本身只在本地仓库中保存一份,需要 jar 包的工程只需要以坐标的方式简单的引用一下就可以了。不仅极大的节约了存储空间,让项目更轻巧,更避免了重复文件太多而造成的混乱。

前面我们实现 Web 阶段项目,要能够将项目运行起来,就必须将该项目所依赖的一些 jar 包添加到工程中,否则项目就不能运行。试想如果具有相同架构的项目有十个,那么我们就需要将这一份 jar包复制到十个不同的工程中。我们一起来看一个CRM项目的工程大小。
使用传统 Web 项目构建的 CRM 项目如下:
image-20230218111213830

原因主要是因为上面的 WEB 程序要运行,我们必须将项目运行所需的 Jar 包复制到工程目录中,从而导致了工程很大。

同样的项目,如果我们使用 Maven 工程来构建,会发现总体上工程的大小会少很多。如下图:

image-20230220083553551

小结:以初步推断它里面一定没有 jar 包,继续思考,没有 jar 包的项目怎么可能运行呢?

image-20230220083638910

我们之前的web项目,jar包放在 项目中的lib下,— 会增大项目占用的内存!

Maven项目, jar包不在项目中, 通过坐标去仓库找jar! —– 减小了项目所占用的空间,以及提高了jar利用率;

  1. jar 包之间的依赖关系

jar 包往往不是孤立存在的,很多 jar 包都需要在其他 jar 包的支持下才能够正常工作,我们称之为jar 包之间的依赖关系。最典型的例子是:commons-fileupload-1.3.jar 依赖于 commons-io-2.0.1.jar,如果没有 IO 包,FileUpload 包就不能正常工作。当你的项目中需要用到上百个 jar 包时,你还会人为的,手工的逐一确认它们依赖的其他 jar 包吗?这简直是不可想象的。

而引入 Maven 后,Maven 就可以替我们自动的将当前 jar 包所依赖的其他所有 jar 包全部导入进来,无需人工参与,节约了我们大量的时间和精力。

  1. 获取第三方 jar 包

JavaEE 开发中需要使用到的 jar 包种类繁多,几乎每个 jar 包在其本身的官网上的获取方式都不尽相同。为了查找一个 jar 包找遍互联网,身心俱疲,没有经历过的人或许体会不到这种折磨。

使用 Maven 我们可以享受到一个完全统一规范的 jar 包管理体系。你只需要在你的项目中以坐标的方式依赖一个 jar 包,Maven 就会自动从中央仓库进行下载,并同时下载这个 jar 包所依赖的其他 jar 包 。

  1. 将项目拆分成多个工程模块

随着 JavaEE 项目的规模越来越庞大,开发团队的规模也与日俱增。一个项目上千人的团队持续开发很多年对于 JavaEE 项目来说再正常不过。那么我们想象一下:几百上千的人开发的项目是同一个 Web工程。那么架构师、项目经理该如何划分项目的模块、如何分工呢?这么大的项目已经不可能通过package 结构来划分模块,必须将项目拆分成多个工程协同开发。多个模块工程中有的是 Java 工程,有的是 Web 工程。

image-20230220094839990

上层模块依赖下层,所以下层模块中定义的API都可以为上层所调用和访问。

  1. 处理jar包之间的冲突

上一点说的是jar包不足项目无法正常工作,但其实有的时候jar包多了项目仍然无法正常工作,这就是jar包之间的冲突。

举个例子:我们现在有三个工程MakeFriend、HelloFriend、和Hello。MakeFriend依赖HelloFriend,HelloFriend依赖Hello。而Hello依赖log4j.1.2.17.jar,HelloFriend依赖log4j.1.2.14.jar。如下图所示:

image-20230220095217201

那么MakeFriend工程的运行时环境中该导入log4j.1.2.14.jar呢还是log4j.1.2.17.jar呢?
这样的问题一个两个还可以手工解决,但如果系统中存在几十上百的jar包,他们之间的依赖关系会非常复杂,几乎不可能手工实现依赖关系的梳理。

使用Maven就可以自动的处理jar包之间的冲突问题。因为Maven中内置了两条依赖原则:最短路径者优先和先声明者优先,上述问题MakeFriend工程会自动使用log4j.1.2.14.jar。

3、Maven 的依赖管理

Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven 提供了一种高度控制的方法。

传统的 WEB 项目中,我们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大。那么maven 工程是如何使得工程变得很少呢?
分析如下:

image-20230220095541086

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

Maven 可以避免去搜索所有所需库的需求。Maven 通过读取项目文件(pom.xml),找出它们项目之间的依赖关系。

我们需要做的只是在每个项目的 pom 中定义好直接的依赖关系。其他的事情 Maven 会帮我们搞定。

那么问题来了

第一:”存放 jar 包的仓库”长什么样?
第二:通过读取 pom.xml 文件中的坐标,再到仓库中找到 jar 包,会不会很慢?从而导致这种方式不可行!

第一个问题:存放 jar 包的仓库长什么样,这一点我们后期会分析仓库的分类,也会带大家去看我们的本地的仓库长什么样。

第二个问题:通过 pom.xml 文件配置要引入的 jar 包的坐标,再读取坐标并到仓库中加载 jar 包,这样我们就可以直接使用 jar 包了,为了解决这个过程中速度慢的问题,maven 中也有索引的概念,通过建立索引,可以大大提高加载 jar 包的速度,使得我们认为 jar 包基本跟放在本地的工程文件中再读取出来的速度是一样的。这个过程就好比我们查阅字典时,为了能够加快查找到内容,书前面的目录就好比是索引,有了这个目录我们就可以方便找到内容了,一样的在 maven 仓库中有了索引我们就可以认为可以快速找到 jar 包。

4、项目的一键构建

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

什么是构建?

指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理,这个过程称为构建。

一键构建

指的是整个构建过程,使用 maven 一个命令可以轻松完成整个工作。
Maven 规范化构建流程如下:

image-20230220110243749

5、构建环节

  1. 清理:删除以前的编译结果,为重新编译做好准备。
  2. 编译:将Java源程序编译为字节码文件。
  3. 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
  4. 报告:在每一次测试后以标准的格式记录和展示测试结果。
  5. 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。
  6. 安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
  7. 部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。

Meven的使用

1、Meven的安装(手动)

1、maven-软件的下载

为了使用 Maven 管理工具,我们首先要到官网去下载它的安装软件。通过百度搜索“Maven“如下:

image-20230220110530715

点击 Download 链接,就可以直接进入到 Maven 软件的下载页面:

image-20230220114340965

目前最新版是 apache-maven-3.5.3 版本,当使用的是apache-maven-3.5.2 版本,大家也可以下载最新版本。
Apache-maven-3.5.2 下载地址:http://archive.apache.org/dist/maven/maven-3/
下载后的版本如下:
image-20230220114554016

2、Maven 软件的安装

Maven 下载后,将 Maven 解压到一个没有中文没有空格的路径下,比如 E:\apache-maven-3.6.1 下面。
解压后目录结构如下:

image-20230220114759531

bin:存放了 maven 的命令,比如我们前面用到的mvn tomcat:run
boot:存放了一些 maven 本身的引导程序,如类加载器等
conf:存放了 maven 的一些配置文件,如 setting.xml 文件
lib:存放了 maven 本身运行所需的一些 jar 包
至此我们的 maven 软件就可以使用了,前提是你的电脑上之前已经安装并配置好了 JDK。

3、JDK 的准备及统一

我们所使用工具软件的统一,JDK 使用 JDK8版本

  1. JDK 环境:

image-20230220160309622

4、maven-及-jdk-配置

配置 MAVEN_HOME ,变量值就是你的 maven 安装 的路径(bin目录之前一级目录)

image-20230220160536053

上面配置了我们的 Maven 软件,注意这个目录就是之前你解压 maven 的压缩文件包在的的目录,最好不要有中文和空格。

编辑系统变量 Path,添加变量值:%MAVEN_HOME%\bin`
image-20230220160724580

再次检查 JDK 的安装目录,如下图:

image-20230220160829736

5、Maven 软件版本测试

通过 mvn -v命令检查 maven 是否安装成功,看到 maven 的版本为 3.5.2 及 java 版本为 1.8 即为安装成功。
找开 cmd 命令,输入 mvn –v命令,如下图:
image-20230220161200917

我们发现 maven 的版本,及 jdk 的版本符合要求,这样我们的 maven 软件安装就成功了。

6、maven仓库的分类

仓库:类似于容器,用于存储资源,主要是各种jar包,比如书包是一个容器,用来存书,衣柜是一个容器,用来存储衣服

image-20230220181909235

说明:

关于仓库,我们前面讲到了有三种:本地仓库,私服,中央仓库,其中私服和中央仓库都属于远程仓库

  1. 中央仓库:jar包,在云端的一台计算机上保存;这台计算机就叫做中央服务器;对应,存储jar包的位置就叫做中央仓库;中央仓库,目前由maven开发团队在维护,里面放着全世界基本99%的jar包;
  2. 本地仓库:我们从中央仓库下载jar包到自己的计算机,那么本地存放(自己下载的)jar包的位置就是本地仓库;当我们在代码中,从本地方库拿东西的时候,如果本地仓库有就直接用了,如果本地仓库没有就会去中央仓库获取;
  3. 私服仓库:为了减轻中央仓库的压力(全世界那么多开发者,如果大家需要jar都从中央仓库拿,那么中央仓库肯定受不了),同时为了方便团队管理,也会设置私服仓库;这样一来,当本地需要某个jar包的时候,就可以从私服仓库拿;私服仓库和本地仓库可能是一个局域网的(比如自己公司内),自然也可能不是一个局域网的;
  4. 私服仓库和中央仓库,称作远程仓库;
  5. 中央仓库中的内容,都是免费、开源的;而那些不开源的,比如,Oracle的驱动jar包就不在中央仓库;所以,我们才说中央仓库放着全世界基本99%(不是100%)的jar包;
  6. 比如,我们公司开发了一个很给力的工具,自然这个工具对应的jar包就不应该放到中央仓库中;如果,自己公司要用,就可以把其放在私服仓库中;(即私服不仅能够提高访问速度,也能够保障版权)

总结:中央仓库:maven团队自身维护的仓库,属于开源的

私服:各公司/部门等小范围内存储资源的仓库,私服也可以从中央仓库获取资源

本地仓库:开发者自己电脑上存储资源的仓库,也可从远程仓库获取资源

私服的作用:

(1)保存具有版权的资源,包含购买或自主研发的jar

(2)一定范围内共享资源,能做到仅对内不对外开放

本地仓库 :用来存储从中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找
默认本地仓库位置在 ${user.dir}/.m2/repository,${user.dir}表示windows 用户目录。

image-20230220191700120

7、坐标

中央仓库地址:https://mvnrepository.com/

我们说maven的仓库里存储了各种各样的资源(jar包),那这些资源我们如何找到它们呢?我们需要知道它们具体的一个位置才能知道如何找到它们,这个就叫坐标

坐标:maven中的坐标用于描述仓库中资源的位置

说明:

**(1)**中央仓库中,存放着大量的资源;;;随着资源越来越多,很显然就遇到了如何有效的查找资源的问题;;;

**(2)**坐标:就是Maven定位仓库中,资源的位置用的;

**(3)**比如,我们可以在maven仓库中,去找我们想要的jar包;https://repo1.maven.org/maven2/

image-20230220191820787

但是,如果我们想找apache下的某个jar包,会发现直接搜搜不到,因为apache的包在org.apache下;
image-20230220191936220

所以,可以发现,Maven仓库中jar的命名层次,还是有点小复杂的;

maven坐标的主要组成如下:

  • groupId:定义当前资源隶属组织名称(通常是域名反写,如:org.mybatis;)
  • artifactId:定义当前资源的名称(通常是项目或模块名称,如:crm,sms)
  • version:定义当前资源的版本号

image-20230220192032931> packaging:定义资源的打包方式,取值一般有如下三种

  • jar:该资源打成jar包,默认是jar java工程打包为jar
  • war:该资源打成war包 web工程打包为war
  • pom:该资源是一个父资源(表明使用maven分模块管理),打包时只生成一个pom.xml不生成jar或其他包结构

总结:

maven的坐标,作用就是帮助我们找到对应的资源;;;而,这个坐标不是给程序员用的,而是给maven这个工具用的;;;Maven会根据这个坐标,去仓库中查找资源;

8、Maven本地仓库的配置

运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录。

image-20230220192231337

Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。

MAVE_HOME/conf/settings.xml文件中配置本地仓库位置(maven 的安装目录下):

image-20230220192406253

打开 settings.xml 文件,配置如下:

image-20230220193432404

当你运行 Maven 命令,Maven 将下载依赖的文件到你指定的路径中。

9、Maven-依赖搜索顺序

当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:

  • 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
  • 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
  • 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
  • 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。

10、Maven 阿里云(Aliyun)仓库

Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。

![image-20230220193736016

  • 国内建议使用阿里云的镜像(可以百度搜 maven 阿里云镜像,也可以打开下方链接)

image-20230220193941405

第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:

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

image-20230220194039505

直接复制资料里面我已经配置好的 settings.xml 文件

2、Maven 工程的认识

现在JavaEE开发领域普遍认同一个观点:约定>配置>编码。意思就是能用配置解决的问题就不编码,能基于约定的就不进行配置。而Maven正是因为指定了特定文件保存的目录才能够对我们的Java工程进行自动化构建。

比照着【Maven工程目录结构】,创建一个工程;

image-20230220194200169

hello
	 src
	    ——main
	        ————java
	        ————resources
	    ——test
	        ————java
	        ————resources
	 pom.xml


src/main/java —— 存放项目的.java 文件
src/main/resources —— 存放项目资源文件,如 spring, hibernate 配置文件
src/test/java —— 存放所有单元测试.java 文件,如 JUnit 测试类
src/test/resources —— 测试资源文件
target —— 项目输出位置,编译后的class 文件会输出到此目录
pom.xml——maven 项目核心配置文件

Maven 提倡使用一个共同的标准目录结构,Maven 使用约定优于配置的原则

image-20230220194729826

Maven 常用命令

我们可以在cmd 中通过一系列的 maven 命令来对我们的 maven-helloworld 工程进行编译、测试、运行、打包、安装、部署。

Maven构建命令使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔。

在pom文件所在目录下执行以下命令,即cd project/java-project目录下。

image-20230220194857442

1、compil

(1)在工程的pom.xml所在目录,通过命令行窗口,执行【mvn compile】命令,去编译项目;

compile 是 maven 工程的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target目录下。
cmd 进入命令状态,执行mvn compile,如下图提示成功:

image-20230220195050580

image-20230220195132630

查看 target 目录,class 文件已生成,编译完成,编译主要是对src 目录下面的 java代码进行编译

2、clean

(2)上面编译的东西,我们不想要了;执行【mvn clean】命令,去清除编译的内容(也就是target了);

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

image-20230220195305065

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

image-20230220195349160

3、test

(3)使用【mvn test】命令,去测试所有测试类中的代码;

test 是 maven 工程的测试命令 mvn test,会执行src/test/java下的单元测试类。
cmd 执行 mvn test 执行 src/test/java 下单元测试类,下图为测试结果,运行 1 个测试用例,全部成功。

image-20230220195456025

执行命令之后会在target目录下面生成一个 test-classse文件

image-20230220195614465

4、package

(4)使用【mvn package】,进行项目打包;

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

package 打包 会编译 src 和 test 目录下面的包,并且打包

image-20230220195836749

查看 pom 文件

image-20230220195900369

5、install

5.使用【mvn install】,将前面打好的jar包(或者是war包)发布到本地仓库;(好处是:当我们把工程安装到本地仓库后,开发的其他项目也就可以引用这个打包好的jar包了);

install 是 maven 工程的安装命令,执行 install 将 maven 打成 jar 包或 war 包发布到本地仓库。
从运行结果中,可以看出:
当后面的命令执行时,前面的操作过程也都会自动执行,会自动执行 test ,package , compile,并且会在仓库里面安装刚刚编译的包

image-20230220200022328

进入到本地的仓库查看刚刚安装的包

image-20230220200115306

6、Maven 指令的生命周期

Maven的生命周期就是对所有的构建过程进行抽象和统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。
Maven有三套相互独立的生命周期,分别是clean、default和site。每个生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

1、clean周期
主要用于清理上一次构建产生的文件,可以理解为删除target目录。
  1)pre-clean:执行清理前需要完成的工作
  2)clean:清理上一次构建生成的文件
  3)post-clean:执行清理后需要完成的工作
命令:mvn clean

2、default周期
主要阶段包括:
  1)process-resources:默认处理src/main/resources/下的文件,将其输出到对应的classpath目录中。
  2)compile:编译src/main/java下的java文件,产生对应的class。
  3)process-test-resources:默认处理src/test/resources/下的文件,将其输出到对应的classpath目录中。
  4)test-compile:编译src/test/java下的java文件,产生对应的class。
  5)test:运行测试用例。
  6)package:打包构件,即生成对应的jar包、war包等。
  7)install:将构件部署到本地仓库。
  8)deploy:部署构件到远程仓库。
命令:
mvn install
mvn package
mvn clean package #调用clean生命周期的clean阶段和default生命周期的package阶段

3、site周期
主要阶段包括:
  1)site:产生项目的站点文档。
  2)site-deploy:将项目的站点文档部署到服务器。
命令:
mvn site

image-20230220200307447

idea 开发maven项目

在实战的环境中,我们都会使用流行的工具来开发项目。

IntelliJ IDEA 已经内建了对 Maven 的支持。

查看 maven 是否安装完成

image-20230220161200917

idea 的 maven 配置

打开 —–> File —–> Settings 配置 maven

依据图片指示,选择本地 maven 安装目录,指定 maven 安装目录下conf文件夹中 settings 配置文件。

image-20230220200725023

我们可以到 http://mvnrepository.com/搜索需要的jar包的依赖信息。
http://search.maven.org/

创建Maven工程

  1. 创建 HelloFriend(旧版)

image-20230220200902557
image-20230220201019851

  1. 在pom.xml配置文件中配置当前工程
<?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.atuigu</groupId>
    <artifactId>HelloFriend</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

主程序 在src/main/java目录下新建文件HelloFriend.java

package com.atguigu;

public class HelloFriend {
  

    public static void main(String[] args) {
        Hello hello = new Hello();
        hello.setName("哈哈");
        System.out.println(hello);
    }
}

新建项目maven_web(22版)

image-20230220201445673

双击 pom.xml 文件、

<packaging>war</packaging>

右键main ,新建文件 ,文本框输入 webapp/WEB-INF/web.xml

image-20230220201656977

打开web.xml

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

   
</web-app>

在webapp文件夹下面新建index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>欢迎使用MAVEN创建WEB项目</h1>
</body>
</html>

使用maven运行程序 ,使用命令 tomcat:run

image-20230220201942256

运行程序请求http://localhost:8080/maven_web/

依赖传递

创建了一个maven工程【project-java】,并且使用了【mvn install】,将前面打好的jar包(或者是war包)发布到本地仓库;(好处是:当我们把工程安装到本地仓库后,开发的其他项目也就可以引用这个打包好的jar包了);

创建项目project01

添加坐标

<dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
</dependencies>

创建项目project02

添加坐标

<dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.13</version>
        </dependency>
</dependencies>

创建项目project03

添加坐标

<dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>
</dependencies>

image-20230220202307517

项目二需要用到项目三里面的东西,修改项目二的pom.xml配置文件

 <dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.13</version>
        </dependency>
        <dependency>
            <groupId>com.atguigu</groupId>
            <artifactId>project03</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

项目二会出现项目三的坐标

image-20230220202432961

项目三添加坐标

<dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

image-20230220202520313

排除传递

**(1)**对于那些,不归我们控制的依赖,自然可以使用排除依赖;

项目三有一个Junit,项目二不想继承Junit,直接排除

image-20230220202704286


总结:Maven是一个管理工具,在实际开发中,一般只需要配置一遍就可一直使用,Maven的常用命令的话,在idea中也可非常的方便的点击使用,总之,Maven是非常容易的。

每日金句:一无所知的世界,走下去才有惊喜

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值