《Maven实战》阅读笔记(一)

Maven概述

1. 什么是Maven

Maven是自动化构建工具和依赖管理工具

2. 为什么要使用Maven

一个项目大致经历编译、测试、打包、安装、部署这几个阶段,如果手动一步一步进行操作的话太浪费时间。
而使用Maven只需要很少的命令就能完成,当然,我们需要为这种方便牺牲一些自由,其实也就是遵守Maven的一些规范。

安装(install):将项目打成jar包,安装到本地Maven仓库,方便其他的项目使用。

部署(deploy):将war包部署到远程容器

3.Maven的目录结构

  1. Maven安装目录下,有bin,boot,conf,lib等目录,其中conf下的setting.xml,修改将作用于全局Maven行为
  2. 用户目录下的.m2目录下,通常只有repository和settings.xml两个文件,改settings.xml将作用于用户下的Maven项目;
    而repository用于存放本地下载下来的maven构件。

Maven的依赖

1.pom.xml

POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

pom中的常见属性

<package>jar/pom/package>//项目的打包类型,默认为jar
<dependencies>//项目的依赖
    <dependency>dependencies>
dependency>
依赖dependency的常见属性

groupId、artifactId和version:项目坐标

type:以依赖类型,默认为jar

scope:依赖范围

optional:是否可选

exclusions:排除传递依赖

2.Maven的坐标

为了便于确定构件在仓库中的唯一坐标,Maven引入groupId、artifactId、version、packaging、classifier属性。

groupId:该项目的实际隶属项目,而不是所属的组织。因为一个项目下有很多模块,若groupId定位到组织,则artifactId只能定位到项目,则无法定位模块。
例如SpringFramework这一实际项目下,有spring-core、spring-context等子模块。groupId一般与域名反向对应。(项目必须)

artifactId:定义一个项目的模块,推荐将实际项目作为前缀。(项目必须)

packing:构建的打包方式,例如,nexus-indexer-2.0.0.jar与nexus-indexer-2.0.0.war是不同的构件。(可选)

classifier:定义附属构件,我们不能在项目中定义项目的classifier,通常为插件生成。附属文件通常为doc等,这样附属构件也有了他自己的坐标。(不能直接定义)

3.maven的依赖范围

在dependency中有一个scope属性,该属性表示依赖的作用范围,常见的有compile、test、runtime这几个值,当然也有不常见的provided和system。其中compile是默认值。

在编译、测试、运行时会使用不同的classpath,而不同值对classpath的影响如下:(Y表示在会加入此阶段classpath)

编译的classpath 测试的classpath 运行时的classpath
compile Y Y Y
test N Y N
provide Y Y N
runtime N Y Y

4. 依赖传递与依赖调解

maven会解析依赖的依赖,将符合条件的依赖引入当前项目。为保证构件在本项目有唯一的版本,在依赖调节过程中,遵循路径最短,同样路径下先声明先使用的原则。

依赖调节原则:

A->B->C(1.0),A->D->E->C(2.0),路径最短,将使用C(1.0)

A->B->C(1.0),A->D->C(2.0),先声明先使用,使用C(1.0)

符合条件的依赖:不是所有的依赖都会引入到当前项目,可选依赖将不会传递。举例:

<dependency>
    <group>mysqlgroup>
    <artifactId>mysql-connector-javaartifactId>
    <vision>5.1.10vision>
    <optional>trueoptional>//此依赖将不会被传递。只会被本项目(直接依赖)引入
dependency>

传递依赖的依赖范围在本项目中的影响:(第一竖排表示第一直接依赖,第一横行表示第二直接依赖,表中结果表示在本项目中的依赖范围)

compile test provide runtime
compile compile - - runtime
test test - - test
provide provide - provide provide
runtime runtime - - runtime

若要排除依赖(排除一些回本项目有影响的快照以依赖版本),可使用exclusions属性。

5.查看依赖树

若要查看本项目的依赖情况,可使用如下命令

mvn dependency:list//显示本项目的所有依赖及其以依赖范围
mvn denpendency:tree//以层级的方式显示本项目中的所有依赖,层级:依赖路径长度

你可能感兴趣的:(Maven,maven,java)