什么是Maven
- Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。
- 项目构建:
- 项目构建不等同于项目创建,项目创建是一瞬间完成,项目构建是一个过程,这个过程包含以下7个步骤
- 项目构建步骤
- 清理
- 编译
- 测试
- 报告
- 打包
- 安装
- 部署
- 依赖管理:jar包之间依赖【项目之间依赖】
maven的相关配置
在官网下载maven然后解压
把maven的目录配置到环境变量中
打开setting.xml文件进行相关的配置:
指定仓库,默认的仓库是
C:\Users\pandi.m2\repository
指定阿里镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
指定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>
idea整合maven
File=>settings=>Maven
新建maven项目
idea的版本过高的话会没有新建maven的那个选项,有Maven Archetype 这时候点上面的那个New Project创建maven项目
下面就是maven项目创建的界面了
maven 核心概念
pom概述
- pom:project object model【项目对象模型:将整个项目封装为对象模型,便于maven管理项目】
- dom:document object model【文档对象模型】
- pom.xml基本结构
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 定义父工程坐标-->
<parent>
<artifactId>maven_pro</artifactId>
<groupId>com.atguigu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 定义模块版本-->
<modelVersion>4.0.0</modelVersion>
<!-- 定义模块名称-->
<artifactId>Hello</artifactId>
<!-- 定义打包方式-->
<packaging>pom</packaging>
<!-- 定义聚合子工程【只能在父工程中定义聚合】-->
<!--
<modules>
<module>Hello</module>
<module>HelloFriend</module>
<module>MakeFriend</module>
<module>OurFriend</module>
</modules>
-->
<!--定义坐标父标签-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Maven工程约定目录结构
-
Java圈不成文规则【约束(约定)>配置>代码】
-
普通java工程
- 项目名称【模块名称】
- src【书写源代码】
- main【主程序代码】
- java【java代码】
- resources【配置文件】
- test【测试代码】
- java【java代码】
- main【主程序代码】
- pom.xml【书写maven配置文件】
- target【编译后】
web版maven工程
- src【书写源代码】
- 项目名称【模块名称】
-
项目名称【模块名称】
- src【书写源代码】
- main【主程序代码】
- java【java代码】
- resources【配置文件】
- webapp
- WEB-INF
- web.xml
- WEB-INF
- test【测试代码】
- java【java代码】
- main【主程序代码】
- pom.xml【书写maven配置文件】
- target【编译后】
- src【书写源代码】
Maven的插件与目标
- 插件
- 本质:由jar包和配置文件组成
- 作用:实现maven功能
- 目标
- 插件与目标关系:每个插件都能实现多个功能,每个功能就是一个插件目标。
Maven生命周期
- 概述:
- Maven生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven就可以自动化的执行构建命令了。
- Maven有三套相互独立的生命周期,相互不影响,分别是:
- Clean Lifecycle在进行真正的构建之前进行一些清理工作。
- Default Lifecycle构建的核心部分,编译,测试,打包,安装,部署等等。
- Site Lifecycle生成项目报告,站点,发布站点。
- 注意:执行生命周期中后面构建环节,会默认执行前面构建环节【但:不会跨越独立生命周期执行】
Maven仓库【重点】
-
仓库分类
- 本地仓库:为当前本地计算机提供服务的仓库
- 远程仓库:
- 私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。
- 局域网:当前一间教室或某几间教室联网
- 万维网:当前开通“外网”,可与全世界联网
- 中央仓库:架设在Internet上,为全世界所有Maven工程服务。
- 中央镜像仓库:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。
- 私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。
-
仓库文件【jar包&配置文件】
① Maven的插件
② 我们自己开发的项目的模块
③ 第三方框架或工具的jar包
Maven坐标【重点】
- 作用:使用坐标,将仓库中jar包引入到当前项目中【模块】
- 语法:在pom.xml文件中,dependencies标签内部添加dependency标签即可
- dependency标签内部详情:
- groupId:当前公司或组织域名倒序
- artifactId:当前项目名称
- version:当前项目版本
<!--定义坐标父标签-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
- 注意:
- g-a-v:本地仓库jar包位置
- a-v:jar包全名
- 坐标与jar包对应关系:一个坐标对应“多”个jar包
- 坐标查询:http://mvnrepository.com
Maven依赖【重点】
-
基本概念
-
当A jar包需要用到B jar包中的类时,我们就说A对B有依赖。例如:commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar。
-
如果A依赖B,B依赖C,那么A→B和B→C都是直接依赖,而A→C是间接依赖。
-
依赖语法
-
在dependencies中添加一个子标签:
- compile(默认就是这个范围):表示jar包在main、test、tomcat下均有效
- test:表示jar包只能在test目录下有效【不会实现间接依赖】
- provided:表示当前jar包只能main、test下有效【在tomcat下无效】【不会实现间接依赖】
- servlet-api
-
依赖传递性
-
路径最短者优先【就近原则】
-
先声明者优先原则
-
统一管理版本号
<properties>
<spring-version>5.3.3</spring-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring-version}</version>
</dependency>
</dependencies>
Maven继承
打包方式:在pom.xml中添加标签
- jar:java工程
<packaging>jar</packaging>
- war:web工程
<packaging>war</packaging>
- pom:父工程
<packaging>pom</packaging>
- 方式一
- 在父工程中pom.xml中导入相关jar包即可,在子工程就会自动导入【一定导入】
- 注意:如子工程中存在相同的jar包,会覆盖父工程jar包
- 在父工程中pom.xml中导入相关jar包即可,在子工程就会自动导入【一定导入】
- 方式二
- 先在父工程中定义需要被继承jar包
<!-- 方式二-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
</dependencyManagement>
2.在子工程中添加需要继承的jar包
<parent>
<artifactId>maven_pro</artifactId>
<groupId>com.atguigu</groupId>
<version>1.0-SNAPSHOT</version>
<!--设置父工程pom.xml路径【相对路径】-->
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--不能写版本号-->
</dependency>
</dependencies>
注意:子工程中不能书写jar包的版本号
Maven聚合
-
语法:在父工程中添加标签
-
作用:清楚或安装父工程同时也会清楚或安装子工程
-
注意:
-
安装顺序由依赖顺序决定,而不是配置顺序决定
-
清楚父工程时,只会清楚编译后代码【target目录】,不会清楚仓库已安装的jar包
-
-
示例代码
<modules>
<module>Hello</module>
<module>HelloFriend</module>
<module>MakeFriend</module>
<module>OurFriend</module>
</modules>