简介

Maven 翻译为”专家”、”内行”,是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。

Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。

Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。

安装

  1. 检查JAVA_HOME环境变量

    打开cmd输入下面命令,检查是否安装了jdk。

    echo %JAVA_HOME%
  2. 下载

    下载apache-maven-3.6.3-src.zip

  3. 配置环境变量

    MAVEN_HOME或者M2_HOME

    maven编辑系统变量

    编辑path

    maven编辑环境变量

  4. 查看maven版本

    mvn -v

目录结构

maven项目目录结构

常用命令

注意:执行与构建过程相关的 Maven命令,必须进入 pom.xml所在的目录。与构建过程相关:编译、测试、打包、……

mvn clean

清理缓存,删除target文件夹中的一切

mvn compile

编译,输入mvn compile后,maven会自动下载依赖jar,为代码生成字节码文件等,即编译。成功之后,即可在<根目录>/target找到编译出来的class文件。

mvn test-compile

编译命令,执行代码的编译

mvn test

执行测试。执行 target/test-classes/ 目录下的程序,并生成测试报告。测试报告存放的位置 : target/surefire-reports/ 目录下。

mvn package

打包。pom.xml中默认将项目打包成jar文件。执行完成之后,即可在target文件夹内找到jar文件。

mvn install

安装。将本地自定义jar安装到maven仓库,然后在pom中可以直接通过dependency的方式来引用。

比如我的项目是demotest,我执行 mvn install之后,就会在maven的仓库中找到jar包。

E:\apache-maven-3.6.3\repository\com\demo\demotest\0.0.1-SNAPSHOT\

mvn site

生成站点。创建应用程序的文档。

坐标

Maven使用下面三个向量在仓库中唯一定位一个Maven工程
groupId:公司或组织名称域名倒序+项目名
artifactId:模块名
version:版本

<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.10.RELEASE</version>

Maven工程坐标与仓库中路径对应的关系:[groupId][artifactId][version][artifactId]-[version].jar
E:\apache-maven-3.6.3\repository\org\springframework\spring-core\5.2.10.RELEASE\spring-core-5.2.10.RELEASE.jar

仓库

仓库的分类

依赖的范围

maven依赖范围就是用来控制依赖与三种classpath(编译,测试,运行)的关系。

compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的maven依赖,对于编译,测试,运行三种classpath都有效。典型的例子是spring-core,在编译,测试,运行的时候都需要使用该依赖。

**test:**测试依赖范围。使用此依赖范围的maven依赖,只对于测试classpath有效,在编译主代码或运行项目的时候无法使用此类依赖。典型的例子就是junit,它只有在编译测试代码及运行测试的时候才需要。

**provided:**已提供依赖范围。使用此依赖范围的maven依赖对于编译和测试classpath有效,在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行的时候容器已经提供,就不需要重复引入了。

**runtime:**运行时依赖范围。使用此依赖范围的maven依赖对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC的驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。

**system:**系统依赖范围。该范围与三种classpath的关系和provider依赖范围完全一致。但是使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径。由于此依赖不是通过maven仓库解析而且与本机系统绑定,可能造成构建的不可移植因此应该谨慎使用。systemPath元素可以引用环境变量。

依赖范围scope 对主程序是否有效 对测试程序是否有效 是否参与打包 是否参与部署 典型例子
compile spring-core
test × × × junit
provided × × servlet-api.jar
runtime
system

生命周期