简介
Maven是Apache下的一个纯Java开发的开源项目,它包含了项目对象模型(POM - Project Object Model),依赖管理系统(Dependency Management System)、和用来运行定义在生命周期阶段中插件(Plugin)目标的逻辑。可以通过一小段描述信息来管理项目的构建、报告、文档的软件项目管理工具。
常见的项目管理工具还有:Ant、Gradle等。
项目构建
项目构建是一个项目从创建到编码、测试、运行、打包、部署的全过程。
传统项目构建
- 创建项目。
- 在项目中编写源码增加配置以及第三方Jar文件等。
- 对源码进行编译。
- 测试(Junit)。
- 打包(war文件)部署至应用服务器(Tomcat)运行。
Maven项目构建
Maven将项目构建的过程进行标准化,每一个阶段使用一个或多个命令组合完成。
依赖(Jar包)管理
一个项目中需要用使用第三方Jar文件(例如SSM框架需要的Jar文件)才可运行,这些第三方Jar文件就是这个项目的依赖Jar文件。
传统项目的依赖管理
传统项目中的依赖管理完全靠人工进行,将Jar文件手动添加到项目中(WEB-INF/lib)。这样会导致没有对Jar文件的统一管理所产生的版本冲突、Jar文件不好下载、过多的Jar文件导致项目臃肿。
Maven项目依赖管理
Maven项目管理所依赖的Jar文件不需要手动向项目内导入Jar文件,只需要在pom.xml(Maven项目的配置文件)中加入Jar文件的坐标,Maven会自动的从Maven仓库中下载Jar文件并且控制Jar文件之间的依赖。
Maven优点
- Maven对项目的构建进行标准化、使用其相关命令即可完成构建过程。
- 通过在pom中定义坐标从而解决项目中的依赖管理。
- 跨平台(Windows、Linux、Mac OS)。
- 提高开发效率,降低项目的维护成本,且大型项目都采用Maven来构建项目。
下载/安装/配置/集成
官网地址:Maven – Welcome to Apache Maven
版本:Maven3.3以后需要使用jdk7+,目前最新版本为3.6.X,学习使用3.5.0(3.4被官方跳过了)。
Windows安装(重点)
- 新增环境变量MAVEN_HOME=maven解压目录(bin目录的上层)。
- 在环境变量PATH中增加%MAVEN_HOME%/bin。
- 在CMD中输入mvn -v 输出以下信息表示安装成功。
Maven配置(Setting.xml)
Maven的配置信息主要依靠于Setting.xml,在Setting.xml中主要配置,Maven本地仓库的位置,以及镜像地址和Maven项目使用的JDK版本等信息。Setting文件一般存在于两个地方:安装目录下的conf内和${user.home}/.m2/内。前者是Maven的全局配置针对整个操作系统使用者生效、后者是用户个性配置。
本地仓库配置(53行):
镜像地址(主要是用来远程下载Jar包用的172行):
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>;
<mirrorOf>central</mirrorOf>
</mirror>
Maven项目JDK版本指定(297行):
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</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>
在</settings>标签上配置以下信息激活JDK版本指定(323行)
<activeProfiles>
<activeProfile>jdk-1.8</activeProfile>
</activeProfiles>
Maven仓库(Repository)
Maven仓库是简单来说就是存放Jar文件和插件的仓库,按照所属位置的不同可以分为本地仓库、私服、远程仓库、中央仓库。
本地仓库(Local)
用来存储从其它仓库中下载的插件和Jar文件,项目中使用到的插件或Jar文件优先从本地仓库中获得。
远程仓库(Remote)
如果项目中所需的第三方依赖本地仓库没有,Maven会去远程仓库中寻找下载到本地仓库。远程仓库可以是互联网或局域网。(只要不是本地仓库,都可以看成是远程仓库)
私服(Private)
私服就是公司自己搭建的远程仓库服务器即是公司内部的maven远程仓库。里面不光有第三方的插件和Jar文件,还包括了公司内部的Jar文件或插件。
中央仓库(Center)
Maven官方维护的一个远程仓库,里面有非常全的依赖,它包含了世界上绝大部分的开源项目的组件,但是特别慢,所以咱们之前配置了阿里云的Maven镜像仓库来代替中央仓库,这个镜像其实就是阿里云把私服公开了。
Maven依赖流程图
当项目中需要依赖时,Maven首先会从本地仓库中获取。当本地仓库中没有时,Maven会根据配置去远程仓库(可以是私服)中获取。当远程仓库中也没有时会到Maven的中央仓库中获取。
本地仓库-->远程仓库/私服-->远程仓库/中央仓库
POM.XML
POM(Project Object Model)作为Maven的项目对象模型主要包含了三个部分:基本信息、依赖管理、构建。
基本信息
POM的基本信息用来描述整个项目或模块的内容。主要有以下几个部分组成:
标签 | 描述 |
<modelVersion> | Maven模块版本,目前一般取值为4.0 |
<groupId> | 组织ID一般使用包名 |
<artifactId> | 项目名或模块名 |
<version> | 项目或模块的版本号:一般使用SNAPSHOT(快照版/开发版)、RELEASE(发布版/正式版)也可自定义。 |
<packaging> | 打包类型,常见值为:jar、war、pom |
Maven通过groupId+artifactId+version来确定project的位置。简单来说Maven是通过POM中的基本信息来定位project的位置。
依赖管理(dependencies)
向Maven项目中添加项目依赖(Jar)需要在POM.xml中配置依赖坐标。Maven的POM与POM之间存在三种关系、依赖、继承、聚合。
依赖(dependencie)
当前Maven项目(A)需要依赖另一个Maven项目(B)那么我们就可以说A依赖于B(我们之前配置的Jar文件的坐标(依赖)信息实际上就是一个Maven项目)。
POM的依赖主要靠以下标签进行依赖的定位:
<dependencies>
<dependencie>
<groupId>依赖项的groupId</groupId>
<artifactId>依赖项的artifactId</artifactId>
<version>依赖项的版本</version>
<scope>依赖项的作用域</scope>
<exclusions>排除依赖冲突时使用</exclusions>
</dependencie>
</dependencies>
<dependencies>标签是Maven POM中的依赖管理标签。
<dependency>标签内配置每个依赖的坐标。
查看依赖网址:Maven Repository: Search/Browse/Explore
坐标
Maven定位依赖都是根据坐标在仓库中确定一个唯一的文件。
坐标三要素
- groupId:组织ID。
- artifactId:项目名。
- version:版本号。
定位规则(了解)
LocalPath(本地仓库位置)/groupId/artifactId/version/artifactId- version.packaging
scope作用域(重点)
compile编译(默认值/缺省值)
编译时生效,伴随Maven的整个生命周期。
provided期望
类似compile,期望JDK、使用者或容器会提供相关依赖(当我们项目需要编译或开发时需要使用该依赖、但是在部署运行时其它容器会提供相关依赖时我们进行provided配置,否则会出现依赖冲突)。例如:Servlet.jar应用服务器会提供相关依赖。
runtime运行
只在运行时生效。
test测试
只在测试时生效,不会随项目发布。
system系统本地
当maven的Repository内不存在时使用。某些项目并未使用Maven,但我们需要使用时会导致我们无法从Repository中获取对应依赖的坐标信息,我们可以把对应jar存放到WEB-INF/lib中进行引用。可以使用私服解决。
继承
Maven多模块开发时parent内的依赖,对应的子模块也会拥有。
聚合
Maven多模块开发时在父模块中聚合个个子模块。
属性(Properties)
属性表述类似EL表达式,使用<properties>标签来定义属性的引用。
构建(build)
当项目进行到构建阶段时,我们需要在POM中的<build>内进行项目在构建时的一些设置。
插件(Plugin)
<plugins>
<plugin></plugin>
</plugins>
资源(resources)
通过<resources>指定在构建时需要的资源文件。
resources:一个resource元素的列表,每一个都描述与项目关联的文件是什么和在哪里;
targetPath:指定build后的resource存放的文件夹。该路径默认是basedir。通常被打包在JAR中的resources的目标路径为META-INF;
filtering:true/false,表示为这个resource,filter是否激活。
directory:定义resource所在的文件夹,默认为${basedir}/src/main/resources;
includes:指定作为resource的文件的匹配模式,用*作为通配符;
excludes:指定哪些文件被忽略,如果一个文件同时符合includes和excludes,则excludes生效;
testResources:定义和resource类似,但只在test时使用,默认的test
resource文件夹路径是${basedir}/src/test/resources,test resource不被部署。
Maven使用
运行Maven命令(重点)
查看Maven版本:mvn -v / mvn -version
创建项目:mvn archetype:generate
编译:mvn compile
清除:mvn clean
打包:mvn package
安装:mvn install
发布:mvn deploy
运行:mvn tomcat:run、mvn tomcat7:run、mvn jetty:run(根据POM中配置的不同插件选择)
(注意:在Eclipse中使用去掉mvn)
在进行 compile、package、install、deploy或运行命令时一般和clean组合使用并且可以加入参数:
跳过测试 -Dmaven.test.skip=true
强制更新快照 -U
compile、package、install、deploy区别(重点)
- compile只会编译类文件,不会打包。
- package只会将包生成到target内。
- install会将target内的包安装到本地仓库。
- deploy会将target内的包安装到本地仓库并且上传到私服(POM文件需要配置)。
其它命令参考资料:Maven常用命令: - 艺意 - 博客园