Maven 是一个Java语言编写的开源项目管理工具,是Apache软件基金会的顶级项目。主要用于项目构建,依赖管理,项目信息管理。
一、下载配置
官网下载地址:http://maven.apache.org/download.cgi
- 解压下载的压缩包
- 配置环境变量(需要先配置好%JAVA_HOME%环境变量):
- settings.xml,实际项目开发中,Maven的大多数配置都是在该文件中进行设置。
%MAVEN_HOME%/conf目录下的settings.xml,该配置文件针对系统所有用户。 - 系统当前用户目录下.m2下的settings.xml,针对当前用户。如果没有,可复制一份。
二、Maven坐标
maven 的坐标通过 5 个元素进行定义,其中 groupId、artifactId、version 是必须的。packaging 是可选的(默认为jar)
- groupId:定义当前 Maven 项目所属的实际项目,跟 Java 包名类似,通常与域名反向。
- artifactId:定义当前 Maven 项目的一个模块。默认情况下,Maven 生成的文件名会以 artifactId 开头。
- version:定义项目版本。
- packaging:定义项目打包方式(pom, jar, maven-plugin, ejb, war, ear, rar),默认为 jar。
- classifier:定义项目的附属构件,如 spring-webmvc-5.2.5.RELEASE-sources.jar,spring-webmvc-5.2.5.RELEASE-javadoc.jar,其中 sources 和 javadoc 就是这两个附属构件的 classifier。
三、Maven依赖作用域
Maven 对应的有三套 classpath:编译、测试,运行。
scope 选项的值,决定了该依赖会被引入到哪一个 classpath 中。
- compile:编译依赖范围,默认值。此选项对编译、测试、运行三种 classpath 都有效。
- provided:已提供依赖范围。编译和测试有效,运行无效。如 servlet-api ,在项目运行时,tomcat 等容器已经提供,无需 Maven 重复引入;
- runtime:运行时依赖范围。表示编译时不是必须的,但测试和运行是必须的。如 jdbc 驱动实现,编译时只需接口,测试或运行时才需要具体的 jdbc 驱动实现;
- test:测试依赖范围。只对测试有效,表明只在测试的时候需要,在编译和运行时将无法使用该类依赖,如 junit;
- system:系统依赖范围。和 provided 依赖范围一致,需要通过 显示指定,且可以引用环境变量;
四、parent pom的依赖
parent.pom使用dependencies和dependencyManagement管理子项目的公共的依赖。
- dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
- dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
五、Maven私服
可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。
Artifactory和Nexus都有付费版和免费版。
六、Maven内置变量
- ${basedir} 项目根目录
- ${project.build.directory} 构建目录,缺省为target
- ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
- ${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}
- ${project.packaging} 打包类型,缺省为jar
- ${project.xxx} 当前pom文件的任意节点的内容