提起maven,首先想到的就是依赖、pom、项目构建等,然而对于它的了解让我在读了《maven实战》后有了进一步的加深。记录一下学习该知识点过程中的心得体会。
第一章 maven实战
本章讲解了一下maven的历史及作用,maven是一个主要服务于基于java平台的项目构建,依赖管理工具。
何为构建:编译、运行单元测试、生成文档、打包和部署等烦琐且不起眼的工作上,这就是构建
maven最大化的消除了构建的重复,抽取了构建的生命周期。
第五章 坐标和依赖
本章讲解maven的坐标,三大关键元素<groupId>,<artifactId>,<version>决定了某个依赖在仓库中的位置,其中还有其他一些依赖的元素属性
groupId: 定义当前Maven项目隶属的实际项目
artifactId:该元素定义实际项目中的一个Maven项目(模块)
version:该元素定义Maven项目当前所处的版本,当不定义packaging的时候,Maven会使用默认值jar。
classifier:该元素用来帮助定义构建输出的一些附属构件。
scope:依赖的范围
optional:标记依赖是否可选(可选依赖)
exclusions:用来排除传递性依赖
依赖的范围 + 依赖传递:
compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。典型的例子是spring-core,在编译、测试和运行的时候都需要使用该依赖。
test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子是JUnit,它只有在编译测试代码及运行测试的时候才需要。
provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试class-path有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍。
runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行class-path有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
依赖冲突的解决方案:
-
声明优先 -
最短路径优先 -
<exclusion>元素排除依赖
第六章 仓库
在Maven世界中,任何一个依赖、插件或者项目构建的输出,都可以称为构件
仓库的分类
-
本地仓库(默认在~/.m2/repository有一个用户仓库) -
远程仓库