一 Maven简介
作为 Apache 组织中的一个颇为成功的开源项目,Maven主要用于基于Java平台的项目的构建和依赖的管理。
maven官网:http://maven.apache.org/
maven下载:https://archive.apache.org/dist/maven/binaries/
maven坐标查询:https://mvnrepository.com/
二 Maven下载、安装、配置、与IDEA的整合
https://www.cnblogs.com/xihehua/p/9639045.html
三 Maven中的核心概念
3.1 maven的坐标
在高中,我们都学过空间三维直角坐标系,(x,y,z)可以精确的定位到一个点;maven作为一个庞大的构建仓库,其规范也是如此,通过(groupId,artifactId,version)我们可以精准的定位一个具体的依赖 jar
• groupId:定义当前Maven项目隶属项目,比如:com.alibaba.otter
• artifactId:定义实际项目中的一个模块
• version:定义当前项目的当前版本
• packaging:定义该项目的打包方式,默认为jar, 父子项目中,父项目的打包方式通常为pom( 即<packaging>pom</packaging>)
3.2 maven的依赖范围与依赖管理
依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系
Maven的依赖管理:使用scope来定义我们依赖的jar包的范围
- compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的maven依赖,对于编译 测试 运行三种的classpath都有效。
- test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试的classpath有效,在编译主代码或者运行主代码的时候都无法依赖此类依赖。典型的例子是jUnit,它只有在编译测试代码及运行测试代码的时候才有效。
- provided:以提供依赖范围。使用此依赖范围的maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行的时候,由于容器已经提供,就不需要maven重复地引入一遍。打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作
- runtime:运行时依赖范围。使用此依赖范围的maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要jdk提供的jdbc的接口,只有在执行测试或者运行测试的时候才需要实现上述接口的jdbc的驱动
- system :系统依赖范围。从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径,该依赖与三种范围的classpath的关系,
和provided依赖范围完全一致。可能造成不可移植,谨慎使用。
3.3 maven的仓库管理
对于Maven来说,仓库只分为两类:本地仓库和远程仓库。当Maven根据坐标寻找构件的时候,它会首先查看本地仓库,如果本地仓库存在此构件,则会直接使用;如果本地仓库不存在此构件,maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用(注意:假如你的网络不好,下载过程中断,你的本地仓库就会出现.lastUpdated文件,再次下载时要把.lastUpdated文件删除,不然下载会出现问题)。如果本地仓库和远程仓库都没有用需要的构件,Maven就会报错
远程仓库:包括公司的nexus 、阿里云与maven的中央仓库
3.4 maven的生命周期
Maven有三套相互独立的生命周期,分别是clean、default和site。每个生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。
- clean生命周期:清理项目,包含三个phase。
1)pre-clean:执行清理前需要完成的工作
2)clean:清理上一次构建生成的文件
3)post-clean:执行清理后需要完成的工作
- default生命周期:构建项目,重要的phase如下。
1)validate:验证工程是否正确,所有需要的资源是否可用。
2)compile:编译项目的源代码。
3)test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
4)Package:把已编译的代码打包成可发布的格式,比如jar。
5)integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
6)verify:运行所有检查,验证包是否有效且达到质量标准。
7)install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
8)Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
- site生命周期:建立和发布项目站点,phase如下
1)pre-site:生成项目站点之前需要完成的工作
2)site:生成项目站点文档
3)post-site:生成项目站点之后需要完成的工作
4)site-deploy:将项目站点发布到服务器
命令行与生命周期
生命周期有前后依赖关系。
mvn clean 调用clean生命周期的clean阶段,执行pre-clean和 clean
mvn test 调用default生命周期的test阶段,执行从validate 到 test的所有阶段
mvn clean install 调用clean周期和 default的从validate到 install的所有阶段。
Maven命令都是基于这些阶段的简单组合而成的。
四 Maven中的插件
jdk1.8
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
五 Maven使用中的一些坑
父子模块,deploy子模块到nexus,其他人拉取不下来
解决办法一:
在parent的pom下执行deploy, 这样就会自动将parent pom以及子module全部发布到仓库了,当然也可以在不需要deploy的子module的pom里配置skip参数,禁止提交
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
解决办法二:
把子module的parent去掉,不去依赖仓库中没有的pom,将子module提升为一个独立的maven项目单独发布
解决办法三:
使用如下命令: mvn deploy -pl 模块名 -am
网友评论