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构建)(在网络不好的时候也能稳定构建)(降低中央仓库负荷)
  • 通过私服存储(部署不能放在中央仓库的构件)

 

 

 

 

 

posted @ 2019-08-14 11:30  JimHan  Views(158)  Comments(0Edit  收藏  举报