Maven实战读书笔记
1.Maven能帮助我们干什么:
- 能帮助我们快速自动化构建项目。(清理、编译、测试、生成报告、打包、部署)
- 能帮助我们引入、管理项目依赖。
2.Maven名词解释
- 构件:打上坐标的所有依赖、插件、个人项目。
- 坐标:唯一标识构件的位置。
- 仓库:存放构件的地方,分为本地仓库、远程仓库、私服、镜像仓库。
3.Maven约定目录
—src
—main
—java
—resource
—test
—java
—resource
—target
—pom.xml
4.Maven主要命令(执行当前命令会顺序执行之前生命周期)
- 清理 mvn clean(执行clean插件,删除target目录)
- 编译 mvn complie(执行compiler插件,主资源处理、主代码编译:target/classes、测试资源处理、测试代码编译:target/test-classes)
- 测试 mvn test(进行单元测试)
- 打包 mvn package(打包)
- 部署 mvn install (发布到本地仓库)
- 发布 mvn deploy (最后发布到远程仓库或私服)
5.POM文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> <!-- 继承,子模块继承父模块pom --> 6 <artifactId></artifactId> 7 <groupId></groupId> 8 <version></version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> <!-- pom版本 --> 11 12 <artifactId></artifactId> <!-- 公司网址的反写 + 项目名 --> 13 <groupId></groupId> <!-- 项目名 + 模块名 --> 14 <version></version> <!-- 第一个是大版本号,第二个是分支版本号,第三个是小版本号 --> 15 <packaging></packaging> <!-- 打包方式,默认为jar --> 16 17 <name></name> <!-- 项目描述名 --> 18 <url></url> <!-- 项目地址 --> 19 20 <modules> <!-- 聚合,构建此模块时自动构建指定模块 --> 21 <module></module> 22 <module></module> 23 </modules> 24 25 <properties> <!-- 在这声明信息,下面可以直接引用 --> 26 <commons-version>3.8.1</commons-version> 27 <junit-version>4.11</junit-version> 28 </properties> 29 30 <dependencyManagement> <!-- 依赖管理,父模块定义,子模块继承父模块定义版本号 --> 31 <dependencies> 32 <dependency> 33 <groupId>org.apache.commons</groupId> 34 <artifactId>commons-lang3</artifactId> 35 <version>${commons-version}</version> 36 </dependency> 37 </dependencies> 38 </dependencyManagement> 39 40 <dependencies> <!-- 依赖列表 --> 41 <dependency> <!-- 依赖项 --> 42 <groupId>junit</groupId> 43 <artifactId>junit</artifactId> 44 <version>4.11</version> 45 <type>pom</type> <!-- 依赖类型,对应packaging,默认值为jar --> 46 <scope>${junit-version}</scope> <!-- 依赖范围 --> 47 <optional></optional> <!-- 标记依赖是否可选 --> 48 <exclusions> <!-- 依赖排除列表,排除传递性依赖 --> 49 <exclusion></exclusion> <!-- 排除项 --> 50 </exclusions> 51 </dependency> 52 </dependencies> 53 54 <build> 55 <pluginManagement></pluginManagement> <!-- 插件管理 --> 56 <plugins> <!-- 插件列表 --> 57 <plugin> 58 <groupId>org.mybatis.generator</groupId> 59 <artifactId>mybatis-generator-maven-plugin</artifactId> 60 <version>1.3.4</version> 61 <configuration> 62 <verbose>true</verbose> 63 <overwrite>true</overwrite> 64 </configuration> 65 <dependencies> 66 <dependency> 67 <groupId>mysql</groupId> 68 <artifactId>mysql-connector-java</artifactId> 69 <version>5.1.44</version> 70 </dependency> 71 <dependency> 72 <groupId>com.baijia</groupId> 73 <artifactId>support-jdbc</artifactId> 74 <version>2.0.1-SNAPSHOT</version> 75 </dependency> 76 </dependencies> 77 </plugin> 78 </plugins> 79 </build> 80 </project>
6.依赖范围:
6.1 三套classpath
编译classpath(编译主代码)测试classpath(编译测试代码、执行测试代码)运行classpath(运行项目)
6.2 五种依赖范围
1. compile:编译依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。
2. test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath都有效(如JUnit,只有在编译测试代码及运行测试的时候需要)。
3. provide:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试的classpath有效。(如servlet-api在运行项目的时候容器已经提供,就不需要重复引入)。
4. runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效。(如JDBC驱动,编译时只需要提供接口,运行的时候才需要实现)。
5. system:系统依赖范围。与provided依赖范围一致,此类依赖往往与本机绑定,可能造成构建的不可移植。
6.3 传递性依赖与依赖范围
第一直接依赖\第二直接依赖 | compile | test | provided | runtime |
compile | compile | runtime | ||
test | test | test | ||
provided | provided | provided | provided | |
runtime | runtime | runtime |
7.传递性依赖的依赖调解问题
- 短路优先: A —> B —> C —> X(1.0) B —> X(2.0) 由于第一个路径是3,第二个路径是2 最终A项目引入X(2.0)
- 第一声明优先: A —> B —> X(1.0) A —> C —> X(2.0) 看A的pom文件先加载的B依赖还是C
8.对依赖的操作
- 可选依赖:A —> B B —> X(可选) B —> Y(可选) X和Y只会影响B项目而不会加载到A项目中。
- 排除依赖:使用场景:A —> B B —> X(不稳定版本) 于是将X排除,重新引入X稳定版本。
- 归纳依赖:使用properties元素定义熟悉或者是版本号,然后使用${xxx} 来引入自定义好的属性。
- 优化依赖:
mvn dependency:list 查看当前项目已解析依赖
mvn dependency:tree 查看当前项目依赖树
mvn dependency:analyze 分析当前项目依赖
[WARNING] Used undeclared dependencies found (已使用但未声明依赖)
[WARNING] Unused declared dependencies found(未使用但已声明的依赖,这个命令只会分析编译主代码和测试代码所用的依赖,执行测试和运行需要的依赖发现不了)
9.Maven仓库的分类
- Maven仓库分为本地仓库、远程仓库。远程仓库又分为中央仓库、私服、其他公共库。
- Maven根据坐标寻找构件时,首先查看本地仓库,若本地仓库存在此构件则使用。若本地仓库不存在,则去远程仓库查找,查找到后下载到本地仓库并使用。若都不存在Maven就会报错。
- (若加入私服)下载maven构件的时候,请求私服下载构件,若私服上不存在该构件,则从远程仓库下载到私服。然后私服再为下载请求提供服务。
10.私服的好处
- 通过私服存储,不用重复下载构件(节省自己的外网带宽)(加速Maven构建)(在网络不好的时候也能稳定构建)(降低中央仓库负荷)
- 通过私服存储(部署不能放在中央仓库的构件)