Maven实战学习

88 阅读3分钟

提起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驱动。

依赖冲突的解决方案:

  1. 声明优先
    
  2. 最短路径优先
    
  3. <exclusion>元素排除依赖
    

第六章 仓库

在Maven世界中,任何一个依赖、插件或者项目构建的输出,都可以称为构件

仓库的分类

  1. 本地仓库(默认在~/.m2/repository有一个用户仓库)
    
  2. 远程仓库
    

image.png