目录
一、简介
1)Maven是Ant的升级版(Ant是Apache下的编译、打包工具);
2)Maven基于POM模型(Project Object Model 项目对象模型),可以实现项目对象之间的依赖、继承、聚合关系,方便项目之间的jar包管理;
3)它用来集中通过管理包的依赖,自动进行包重复、冲突问题解决;
4)它是一个开放架构,提供了公共接口,支持插件的继承;
二、仓库与配置
2.1、Maven仓库
1)它是基于简单文件系统存储,集中管理Java API资源(构建)的一个服务;
2)每个构建都有唯一坐标,坐标即其在仓库中的存储路径;
3)坐标由3部分组成:GroupId
(公司名,多用公司网址倒写)、AtifactId
(项目名)、Version
(版本)
4)仓库分为中央仓库和本地仓库
中央仓库
:是互联网上最大的仓库,但是访问速度较慢,所以通常配置成国内的镜像中央仓库(阿里镜像);
本地仓库
:指用户电脑中存放下载jar包构件的的文件目录;
2.2、访问优先级
本地仓库 - 镜像仓库 - 中央仓库
2.3、settings.xml配置
1)配置本地仓库,默认路径为${user.home}/.m2/repository
<localRepository>C:\Users\Administrator\.m2\repository</localRepository>
2)配置镜像仓库(如阿里镜像)
<mirror>
<!-- 指定镜像 ID -->
<id>nexus-aliyun</id>
<!-- 匹配中央仓库-->
<mirrorOf>central</mirrorOf>
<!-- 指定镜像名称 -->
<name>Nexus aliyun</name>
<!-- 指定镜像路径 -->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
2)配置JDK
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion >
</properties>
</profile>
三、工程类型
1)POM工程
:逻辑工程,用在聚合工程中,或者父级工程用来做 jar 包的版本控制;
2)JAR工程
:Java项目,在打包时会将项目打成 jar 包;
3)WAR工程
:Web项目,在打包时会将项目打成 war 包;
四、项目结构
1)src
:包含了项目所有的源代码和资源文件以及测试代码;
2)src/main/java
:储存 java 源代码;
3)src/main/resources
:储存主要的资源/配置文件(.xml、.properties);
4)src/test/java
:存放测试代码;
5)target
:存放编译后内容;
6)pom.xml
:核心配置文件,管理项目的基本信、继承关系、项目类型、依赖管理、依赖注入、插件管理、插件注入等;
五、POM模型
5.1、依赖关系
在dependencies
中,根据坐标实现包的依赖
5.1.1、依赖传递性
如果A依赖了B,那么C依赖A时会自动把A和B都导入进来
5.1.2、相同资源的依赖原则
1)第一原则:最短路径优先原则
比如A、B、C之间的依赖关系是A->B->C->D(2.0)和 A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短;
2)第二原则:最先声明原则
比如A–>B–>Y(1.0),A–>C –>Y(2.0),Y(1.0)和 Y(2.0)的依赖路径长度是一样,那么在 POM中依赖声明的顺序靠前的优先;
5.1.3、依赖排除
通过exclusions
排除不需要的jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
</exclusions>
</dependency>
5.1.4、依赖范围
通过scope指定依赖范围
1)compile
:默认范围,表示该依赖在编译和运行时生效; 在项目打包时会将该依赖包含进去;
2)provided
:可以参与编译,测试,运行等周期,但是不会被打包到最终的 artifact中;
如servlet-api,编译和测试项目的时候需要该依赖,但在项目打包的时候,由于容器已 提供,所有无需重复引入;
3)runtime
:编译时不需要生效,运行时生效;
如JDBC驱动实 现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时 候才需要实现上述接口的具体JDBC驱动;
4)system
:如果某些依赖的ja 包没有 Maven 坐标的,这时可以把它下载到本地硬盘,通过system来引用(会导致传递依赖中断,不建议使用)
5)test
:只在编译测试代码和运行测试的时生效;(如JUnit)
5.1.5、依赖管理
通过dependencyManagement
可以集中管理依赖信息,比如多个项目继承自同一个公有的父项目,那可以把所有依赖信息放在一个公共的POM文件中,并且在子POM中简单的引用该构件即可;
5.2、继承关系
5.2.1、概念
1)与Java 中的父子继承概念类似;
2)父项目中集中定义依赖和插件(须为POM类型
)
2)子项目中引用;
5.2.2、优点
1)依赖或插件的统一管理(在 parent 中定义,需要变更dependency版本时,只需要修改一处)
2)代码简洁(子项只需要指定 groupId,artifactId即可)
3)dependencyManagement可按需引入(子项目不会继承parent 中 dependencyManagement 所有预定义的 dependency)
5.2.3、多继承
在Maven中默认也是采用单继承,但是我们可以在子项目中通过添加dependencyManagement标记,type
设置为pom
,scope
设置为import
,从而实现多继承;
<dependencyManagement>
<dependencies>
<!--父项目 a-->
<dependency>
<groupId>com.test</groupId>
<artifactId>parent_a</artifactId>
<version>1.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--父项目 b-->
<dependency>
<groupId>com.test</groupId>
<artifactId>parent_b</artifactId>
<version>1.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
5.1、聚合关系
1)聚合可以将多个项目以模块方式聚合在一起,方便项目的管理;
2)聚合包含了继承的特性;
3)父项目为pom类型,在modules
中标识子模块;
4)使用idea创建时,在父项目上右键创建module;
六、常见命令
1)clean
:清除已编译信息,删除target目录;
2)validate
:验证项目是否正确;
3)compile
:只编译,javac命令;
4)test
:执行项目测试;
如果在 test 目录下含有测试代码,那么 Maven 在执行 install 命令会先去执行 test 命令将所有的 test 目录下的测试代码执行一遍,如果有测试代码执行 失败,那么 install 命令将会终止;
5)package
:打包,包含编译、打包2个操作;
6)verify
:运行任何检查,验证包是否有效且达到质量标准;
7)install
:本地安装,包含编译、打包、安装到本地仓库3个操作;
8)site
:项目站点文档创建的处理,该命令需要配置插件;
9)deploy
:远程部署命令;