1、maven的基本介绍
Maven 是⼀个项⽬管理⼯具,可以对 Java 项⽬进⾏构建、依赖管理。Maven 也可被⽤于构建和管理各种项⽬,例如 C#,Ruby,Scala 和其他语⾔编写的项⽬。Maven利⽤⼀个中央信息⽚断能管理⼀个项⽬的构建、报告和⽂档等步骤。
maven 可以管理 jar ⽂件,能⾃动下载 jar 和它的⽂档、源代码,能管理 jar 之间的依赖。Maven 能够帮助开发者完成以下⼯作:构建、⽂档⽣成、报告、依赖、SCMs、发布、分发、邮件列表。
为什么需要maven?:由于 Java 的⽣态⾮常丰富,⽆论你想实现什么功能,都能找到对应的⼯具类,这些⼯具类都是以 jar 包的形式出现的,例如 Spring,SpringMVC、MyBatis、数据库驱动,等等,都是以 jar 包的形式出现的,jar 包之间会有关联,在使⽤⼀个依赖之前,还需要确定这个依赖所依赖的其他依赖,所以,当项⽬⽐较⼤的时候,依赖管理会变得⾮常⿇烦臃肿,这是 Maven 解决的第⼀个问题。
Maven 还可以处理多模块项⽬。简单的项⽬,单模块分包处理即可,如果项⽬⽐较复杂,要做成多模块项⽬,例如⼀个电商项⽬有订单模块、会员模块、商品模块、⽀付模块…,⼀般来说,多模块项⽬,每⼀个模块⽆法独⽴运⾏,要多个模块合在⼀起,项⽬才可以运⾏,这个时候,借助 Maven ⼯具,可以实现项⽬的⼀键打包。
2、安装配置maven
2.1、下载安装maven
安装 maven 直接将下载的压缩包解压即可,解压下载⽂件后可看到⽬录如下:
2.2、配置maven环境变量
然后需要配置环境变量,配置环境变量跟 JDK 类似。
1. 先在系统变量当中添加⼀个环境变量 MAVEN_HOME,变量值为 maven 的安装⽬录的根⽬录,⽐如:E:\\develop\\apache-maven-3.3.92. 然后找到系统变量 Path,给该变量的值后⾯添加:;%MAVEN_HOME%\\bin 即可
检验 maven 安装是否成功,直接在命令窗⼝输⼊ mvn -v ,如果有输出 maven 的版本说明安装成功:
3、maven约定的⽬录结构
Maven 提倡使⽤⼀个共同的标准⽬录结构,Maven 使⽤约定优于配置的原则,⼤家尽可能的遵守这样的⽬录结构。⼀个使⽤Maven管理的普通的Java项⽬,它的⽬录结构默认如下:
MavenProject
|-- pom.xml maven项⽬的配置⽂件。对项⽬中的所有jar包依赖进⾏统⼀管理 |-- src |-- main
| -- java 存放项⽬源代码
| -- resources(可省略) 存放项⽬配置⽂件 .xml等 |-- test(可省略)
| -- java 存放单元测试源代码
| -- resources 存放单元测试资源⽂件 .xml等
|-- target(由maven⽣成) 存放所有编译、打包⽣成的⽂件 |-- classes 存放项⽬源代码编译输出的字节码⽂件 |-- test-classes 存放测试代码编译输出的字节码⽂件
默认情况下,项⽬在编译过后,会将 src/main/java 编译过后的字节码⽂件和 src/main/resource 中的⽂件放在 target/classes ⽬录下。但是,src/main/java ⽬录下的⾮包且⾮java的⽂件在编译过后并不会⾃动被拷贝在 target/classes ⽬录下,⽽是会丢失。如果我们想要将 src/main/java ⽬录下的⾮包且⾮java的⽂件也⼀并拷贝在 target/classes ⽬录下,则需要在 pom.xml ⽂件的 build 标签下进⾏配置。
4、maven仓库配置
Maven 仓库是项⽬中依赖的第三⽅库。在 Maven 中,任何⼀个依赖、插件或者项⽬构建的输出,都可以称之为构件。Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR⽂件(WAR,ZIP,POM等等)的地⽅。Maven 仓库有以下⼏种类型:
本地仓库(local)中央仓库私服仓库
除本地仓库以外的仓库都可以叫做远程仓库。
当项⽬编译时,Maven⾸先从本地仓库中寻找项⽬所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。这 3 个仓库中,jar 包的查找顺序如下:
4.1、本地仓库
Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第⼀次执⾏ maven 命令的时候才被创建。默认位置:当前⽤户名\\.m2\\repository。
运⾏ Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会⾸先尝试从远程仓库下载构件⾄本地仓库,然后再使⽤本地仓库的构件。
本地仓库默认位置在 当前⽤户名\\.m2\\repository,我们也可以修改本地仓库的位置。在 maven 安装⽬录下的 conf/settings.xml ⽂件中可以修改,在该配置⽂件中可以看到 localRepository 节点被注释掉了,我们可以直接复制该节点,将值修改为本地路径即可,如下:
当你运⾏ Maven 命令,Maven 会将下载依赖的⽂件放到你指定的路径中。
4.2、中央仓库
中央仓库属于远程仓库的⼀种,Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了绝⼤多数流⾏的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等,⼀般来说,简单的Java项⽬依赖的包都可以在这⾥下载到。
中央仓库需要通过⽹络才能访问。低版本的 maven 中,⽐如 maven-2.0.10,可以在 ${M2_HOME}/lib/maven-2.0.10-uber.jar 中找到 pom.xml 配置⽂件。但是在 3.xxx 版本及之后的版本,在 maven 安装⽬录下的 lib/maven-model-builder-${version}.jar 下,可以在 \\org\\apache\\maven\\model\\pom-4.0.0.xml 取到 pom-4.0.0.xml 配置⽂件,该配置⽂件是所有 Maven POM 的⽗POM,所有Maven项⽬继承该配置。
你可以在 pom-4.0.0.xml 配置⽂件中找到如下配置信息:
4.3、私服仓库
私服也属于远程仓库的⼀种,⼀般来说,私服仓库搭建在公司局域⽹内,专供公司内部开发⼈员提供服务,不是对外使⽤的。本地仓库(本机)--->私服(局域⽹)--->中⼼仓库(外部⽹络)
4.4、配置中央仓库
4.4.1、在项⽬的 pom.xml ⽂件中配置中央仓库
配置我们⾃⼰的远程仓库有很多好处,⽐如你有⼀个局域⽹的远程仓库,使⽤该仓库能⼤⼤提⾼下载速度,继⽽提⾼构建速度,也有可能你依赖的⼀个 jar 在 central 中找不到,它只存在于某个特定的公共仓库,这样你也不得不添加那个远程仓库的配置。
我们可以在项⽬的 pom.xml ⽂件中配置远程仓库。⽐如下⾯配置远程仓库指向阿⾥云仓库:
...
4.4.2、在maven安装⽬录下的settings.xml⽂件配置 在项⽬的 pom.xml ⽂件中可以配置中央仓库,但是这样每个项⽬都需要配置⼀遍,需要重复⼯作。我们可以直接在 maven 安装⽬录下的 conf/settings.xml ⽂件中配置中央仓库。找到 mirrors 标签,添加如下配置: 可以看到 5、maven项⽬配置⽂件pom.xml maven 安装⽬录下的 setting.xml 主要⽤于配置 maven 的运⾏环境等⼀系列通⽤的属性,是全局级别的配置⽂件。⽽ pom.xml 主要描述了项⽬的基本信息,⽤于描述项⽬如何构建,声明项⽬依赖等等,是项⽬级别的配置⽂件。执⾏任务或⽬标时,Maven 会在当前⽬录中查找 POM,然后读取 POM,获取所需的配置信息,然后执⾏⽬标。pom(project object model)即项⽬对象模型,maven 把⼀个项⽬的结构和内容抽象成⼀个模型,在 xml ⽂件中进⾏声明,以⽅便进⾏构建和描述。⼀个基本的pom.xml⽂件配置如下: 所有 POM ⽂件都需要 groupId + artifactId + version = 坐标,坐标可⽤于标识互联⽹中的唯⼀资源。在Maven中,坐标是Jar包的唯⼀标识,Maven通过坐标在仓库中找到项⽬所需的Jar包。 5.1、pom.xml配置⽂件常见标签 pom.xml 配置⽂件的常见标签: 6、maven的三套⽣命周期 Maven的⽣命周期就是对所有的构建过程进⾏抽象和统⼀。包含了项⽬的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点⽣成等⼏乎所有的构建步骤。Maven的⽣命周期是抽象的,即⽣命周期不做任何实际的⼯作,实际任务由插件完成,类似于设计模式中的模板⽅法。Maven有三套相互独⽴的⽣命周期,分别是 clean:项⽬清理的处理 default(build):项⽬部署的处理site:项⽬站点⽂档创建的处理 每套⽣命周期各⾃包含⼀些阶段(phase),这些 phase 就相当于 Maven 提供的统⼀的接⼝,然后这些 phase 的实现由 Maven 的插件来完成。阶段是有顺序的,后⾯的阶段依赖于前⾯的阶段。各个⽣命周期相互独⽴,⼀个⽣命周期的阶段前后依赖。 ⽐如:执⾏ mvn clean 命令:将会调⽤clean⽣命周期的 clean 阶段,实际上会执⾏ pre-clean 和 clean 阶段;执⾏ mvn test 命令:调⽤ default ⽣命周期的 test 阶段,实际执⾏ test 以及之前所有阶段;执⾏ mvn clean install:调⽤ clean ⽣命周期的 clean 阶段和 default 的install 阶段,实际执⾏ pre-clean 和 clean,install 以及之前所有阶段 6.1、clean⽣命周期 clean⽣命周期:清理项⽬,包含三个阶段:1. pre-clean:执⾏清理前需要完成的⼯作2. clean:清理上⼀次构建⽣成的⽂件 3. post-clean:执⾏清理后需要完成的⼯作 6.2、default(build)⽣命周期 default⽣命周期:构建项⽬,重要的 phase(阶段)如下:1. 2. 3. 4. 5. 6. 7. 8. 9. validate:验证⼯程是否正确,所有需要的资源是否可⽤。compile:编译项⽬的源代码。 test-compile:编译测试源码 test:使⽤合适的单元测试框架来测试已编译的源代码。Package:把已编译的代码打包成可发布的格式,⽐如jar。 integration-test:如有需要,将包处理和发布到⼀个能够进⾏集成测试的环境。verify:运⾏所有检查,验证包是否有效且达到质量标准。 install:把包安装到maven本地仓库,可以被其他⼯程作为依赖来使⽤。 Deploy:在集成或者发布环境下执⾏,将最终版本的包拷贝到远程的repository,使得其他的开发者或者⼯程可以共享。 6.3、site⽣命周期 site⽣命周期:建⽴和发布项⽬站点,phase如下1. 2. 3. 4. pre-site:⽣成项⽬站点之前需要完成的⼯作site:⽣成项⽬站点⽂档 post-site:⽣成项⽬站点之后需要完成的⼯作site-deploy:将项⽬站点发布到服务器 7、maven的常⽤命令 maven常⽤命令如下: mvn clean:清理。该命令会删除 maven 编译⽣成的⽬录,即 target ⽬录,但是已经 install 到本地仓库中的包不会删除。 mvn compile:编译项⽬主代码,即 src/main ⽬录下的 java 程序。编译完成后会在项⽬根⽬录下⽣成⼀个 target/classes ⽬录,⾥⾯存放着 java 程序编译之后⽣成的字节码⽂件。并且 src/main/resource ⽬录下的⽂件都会被放到 target/classes ⽬录下 mvn test-compile:编译项⽬中 src/test⽬录下的测试代码。编译完成后会在项⽬根⽬录下⽣成⼀个 target/test-classes ⽬录,⾥⾯存放着测试代码编译之后⽣成的字节码⽂件。mvn test:运⾏所有的测试代码 mvn package:打包。按照 pom.xml 中的配置,将项⽬打成 jar 包或者 war 包。 mvn install:安装本项⽬包到本地仓库,这样项⽬包可以⽤作其他本地项⽬的依赖。mvn deploy:部署。将最终的项⽬包复制到远程仓库中与其他开发者和项⽬共享。 在命令⾏ CMD 上执⾏以上命令,需在命令⾏进⼊ pom.xml 所在⽬录下即项⽬的根⽬录下才能执⾏。 7.1、maven如何将web项⽬打包成war包 maven 将 java web 项⽬打包成 war 包,⾸先确认⼀下 pom.xml 中的配置的打包类型是打包成 war 包的: 确认好之后,通过命令⾏⼯具切换⾄该 web 项⽬的根⽬录下,执⾏ mvn clean package 命令即可: 打包完成后,可以在该项⽬的根⽬录下的 target ⽂件夹下找到⼀个 war 包。将该 war 包直接放到 tomcat 的 webapps ⽬录下即可部署成功。 部署: 8、maven的插件 Maven ⽣命周期的每⼀个阶段的具体实现都是由 Maven 插件实现的,Maven 实际上是⼀个插件框架,它的核⼼并不执⾏任何具体的构建任务,所有这些任务都交给插件来完成。例如编译源代码是由maven- compiler-plugin完成的。进⼀步说,每个任务对应了⼀个插件⽬标(goal),每个插件会有⼀个或者多个⽬标, 例如 maven- compiler-plugin 的 compile ⽬标⽤来编译位于 src/main/java/ ⽬录下的主源码,testCompile ⽬标⽤来编译位于 src/test/java/ ⽬录下的测试源码。我们在输⼊ mvn 命令的时候 ⽐如 mvn clean,clean 对应的就是 Clean ⽣命周期中的 clean 阶段。但是 clean 的具体操作是由 maven-clean-plugin 插件来实现的。 ⽤户可以通过两种⽅式调⽤ Maven 插件⽬标。第⼀种⽅式是将插件⽬标与⽣命周期阶段绑定,这样⽤户在命令⾏只是输⼊⽣命周期阶段⽽已,例如输⼊ mvn compile 命令,Maven 默认会将 maven-compiler-plugin 的 compile ⽬标与 compile ⽣命周期阶段绑定,因此命令mvn compile 实际上是先定位到 compile这⼀⽣命周期阶段,然后再根据绑定关系调⽤maven-compiler-plugin的compile⽬标。 第⼆种⽅式是直接在命令⾏指定要执⾏的插件⽬标,例如 mvn archetype:generate 就表⽰调⽤ maven-archetype-plugin 的 generate ⽬标,这种带冒号的调⽤⽅式与⽣命周期⽆关。插件配置⽰例: 因篇幅问题不能全部显示,请点此查看更多更全内容