一、概念
Maven是一款自动化构建工具,专注服务于Java平台的项目自动化构建和jar包依赖管理。
二、构建环节
以下构建环节都由Maven自动构建进行
1.清理:删除以前的编译结果,为重新编译做好准备。
2.编译:将java源程序编译为字节码文件。
3.测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
4.报告:在每一次测试后以标准的格式记录和展示测试结果。
5.打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应 jar包,Web工程war包
6.安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
7.部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
三、Maven九个核心概念
1.POM:pom.xml配置文件
2.约定的目录结构:
3.坐标:pom中依赖jar包的路径,路径指向本地仓库
4.依赖管理:jar包之间的依赖管理
5.仓库管理:放jar包的地方
6.生命周期:maven的执行过程
7.插件和目标:
8.继承:父子项目之间的关系
9.聚合:多个项目聚合到一个项目
四、Maven项目
第一步:创建约定的目录结构
Hello(项目名)
src
——main(存放主程序——业务代码、配置文件)
——java(包名、类)
——resources(三大框架配置文件)
——test(存放测试程序)
——java(单元测试代码)
—resources(单元测试用到的资源文件)
pom.xml
第二步:创建Maven的核心配置文件pom.xml
第三步:编写主程序
在src/main/java/com/atguigu/maven目录下创建新文件Hello.java
第四步:编写测试代码
在src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java
第五步:运行几个基本的Maven命令
1.打开cmd命令行,进入Hello项目根目录(pom.xml文件所在目录)执行
mvn complie(编译) 命令,查看根目录变化
2.cmd中继续录入mvn clean(清理)命令,然后再次查看根目录变化
3.cmd中录入mvn clean compile命令,查看根目录变化
4.cmd中录入mvn test-compile(对测试程序进行编译) 命令,查看target目录 变化
5.cmd中录入mvn clean test(运行) 命令,查看target目录变化
6.cmd 中录入mvn clean package(打jar包) 命令,查看target 目录变化
7.cmd 中录入 mvn source:jar (生成源码包)命令,查看target 目录变化
8.cmd 中录入 mvn install(安装)命令
注意:运行Maven命令时一定要进入pom.xml文件所在的目录
五、pom.xml文件
<?xml version="1.0" ?>
<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">
<modelVersion>4.0.0</modelVersion>
<!--坐标 gav -->
<groupId>com.atguigu.maven</groupId><!--组织+项目+ID-->
<artifactId>Hello</artifactId><!--模块名 -->
<version>0.0.1-SNAPSHOT</version><!--版本-->
<!--项目名-->
<name>Hello</name>
<!--依赖管理:需要引用第三方jar包,通过dependency标签来进行配置 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope><!--依赖范围-->
</dependency>
</dependencies>
</project>
六、通过坐标到仓库中查找jar包
1.将gav三个向量连接起来
com.atguigu.maven+Hello+0.0.1-SNAPSHOT
2.以连起来的字符串作为目录结构到仓库中查找
com/atguigu/maven/Hello/0.0.1-SHAPSHOT/Hello-0.0.1-SNAPSHOT.jar
##注意:我们自己的Maven工程必须执行安装操作才会进入仓库。安装命令是mvn install
安装:将当前项目打好的jar包从工作空间整到仓库的过程叫做安装
<!-- Mavnen项目类型:
jar 表示Java项目,默认值
war 表示Web项目
pom 表示父工程
-->
七、依赖管理
http://mvnrepository.com
1.基本概念
当A jar包需要用到B jar包中的类时,我们就说A 对 B 有依赖。例如:commons-fileupload-1.3.jar 依赖于commons-io-2.0.1.jar。
2.直接依赖和间接依赖
如果A依赖B,B依赖C,那么A——B和B——C都是直接依赖,而A——C是间接依赖。
3.依赖的范围
当一个Maven工程添加了对某个jar包的依赖后,这个依赖的jar包可以对应下面几个可选的范围:
(1)compile
A.main目录下的java代码可以访问这个范围的依赖
B.test目录下的java代码可以访问这个范围的依赖
C.部署到Tomcat服务器上运行时要放在WEB-INF的lib目录下
例如:对Hello的依赖。主程序、测试程序和服务器运行时都需要用到。
(2)test
A.Main目录下的java代码不能访问这个范围的依赖
B.Test目录下的java代码可以访问这个范围的依赖
C.部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
例如:对junit的依赖。仅仅是测试程序部分需要
(3)provided
A.Main目录下的java代码可以访问这个范围的依赖
B.Test目录下的java代码可以访问这个范围的依赖
C.部署到Tomcat服务器上运行时不会放在WEB-INF 的lib目录下
例如:servlet-api 在服务器上运行时,Servlet容器会提供相关API,所以部署的时候不要。
(4)runtime[了解]
(5)其他:import、system等。
八、依赖的传递性
A依赖于B:在A的pom.xml文件配置B的gav信息
compile范围具有传递性,test和provided的范围不具有传递性
最短路径者优先
路径相同时先声明者优先
九、依赖的排除
对所以依赖的其他包进行依赖排除,把用不上的包排除掉
有时候为了确保 程序正确可以将有可能重复的间接依赖排除。排除后也可以自行依赖其他版本。
<exclusions>
<exclusion>
<g>
<a>
</exclusion>
</exclusions>
十、统一管理目标jar包的版本
以对Spring的jar包依赖为例:Spring的每一个版本都包含spring-core(核心包)、spring-context(上下文)等jar包。我们应该导入版本一致的Spring jar包,而不是使用5.2.5的spring-core的同时使用5.2.6的spring-context。
<!--全局变量声明。可以声明版本号-->
<properties>
<spring.version>5.2.5.RELEASE</spring.version><!--自己随便定义的-->
</properties>
##放在<dependencies>外面的
<dependency> <!-- 放到版本号的位置-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${spring.version}</version>
</dependency>
十一、Maven仓库
下载解压后在conf文件夹里打开settings.xml文件,在标记中插入如下代码(如果没有的标记需要在标记外加入标记):
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
如果配置完setting.xml文件后不能从阿里云下载,就在pom.xml文件配置如下代码:
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<repositories>标记和pom.xml文件中的<dependencies>标记同级
十二、Maven的生命周期
作用:Maven生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven就可以自动化的执行构建命令了
类型:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作
Default Lifecycle(默认) 构建的核心部分,编译,测试,打包,安装,部署等等
Site Lifecycle 生成项目报告,站点,发布站点。
mvn site:生成站点
1、clean声明周期
(1)pre-clean执行一些需要clean之前完成的工作
(2)clean移除所有上一次构建生成的文件
(3)post-clean执行一些需要在clean之后立刻完成的工作
2、Site生命周期
(1)pre-site执行一些需要在生成站点文档之前完成的工作
(2)Site生成项目的站点文档
(3)Post-site执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
(4)Site-deploy将生成的站点文档部署到特定的服务器上
这是经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这是Maven强大的功能。
3、Default生命周期
complie
clean
package
install
4、运行任何一个阶段的时候,它前面的所有阶段都会被运行。
十三、继承
例:
父工程:Maven001
<!-- 依赖管理配置声明:声明配置,当前项目并不会直接引入jar包。
子项目继承父项目,子项目不能直接使用jar包。子项目想用,
必须的声明才能使用。
优点:由父工程管理版本,子工程不需要管理版本
父工程中改为<packaging>pom</packaging>-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
子工程:A
<!-- A继承maven001 父工程(<dependencies>标签外)
通过继承关系,推荐由父工程管理版本和依赖范围,将子工程内的a和v 删除-->
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>maven001</artifactId> <!--父工程地址-->
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!--- 相对路径指定父工程的pom文件位置-->
</parent>
十四、聚合
在总的聚合工程中使用modules/module标签组合,指定模块工程的相对路径即可
<!-- 聚合:对当前项目进行任何操作,被聚合的项目都跟着做相同操作-->
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
</modules>