Maven

一、概述

1、介绍

  • apache组织提供的顶级项目

  • 但凡是阿帕奇提供的技术,都是由java开发工具

  • 项目的管理工具

2、完成一个java项目需要做那些工作

  • 项目要做什么,项目组成部分

  • 设计项目,步骤,使用哪些技术,需要多少人,多长时间

  • 组建团队,招人,购置设备,服务器,软件,笔记人…..

  • 开发人员编写代码,开发人员需要测试

  • 测试人员再次进行测试,测试项目功能是否符合要求

Maven可以使我们做上面/下面这些功能更加简单

3、对比

传统开发项目【没有使用maven】

  • 很多模块,模块之间的关系,手动管理十分繁琐

  • 项目需要第三方功能【jar包】 需要手动从网络中获取各个jar包

  • 手动管理jar包的版本

  • 手动管理jar文件之间的依赖 【项目要使用a.jar需要使用b.jar里面的类】

使用maven管理的项目

  • 可以管理jar文件,自动下载jar和他的文档,源代码

  • 自动管理jar之间的依赖 【a.jar需要b.jar maven会自动下载】

  • 自动管理jar版本

  • 帮你编译程序 .java —-> .class

  • 帮你测试你的代码 是否正确

  • 帮你打包文件,形成jar文件或war文件

  • 帮你部署项目

3、什么是构建

项目的构建 【面向过程的,就是一些步骤】

完成项目代码的编译,测试,打包,部署

4、maven所支持的构建:

  • 清理 (mvn clean)【把之前项目编译的东西删除掉,为新的编译代码做准备】

  • 编译 【把源代码编译为可执行代码 .java—>.class 批量编译】

  • 一次性的编译成千上百个文件,和javac 不一样 javac只能一次一个

  • 测试 【maven可以执行测试程序代码,验证你的功能是否正确。】

  • 批量的,maven可以同时执行多个测试代码,同时测试很多功能

  • 报告 【生成测试结果的文件,测试通过没有】

  • 打包 【把你的项目中所有的calss文件,配置文件等所有资源放到一个压缩文件中】

  • 这个压缩文件就是项目的结果文件,通常java程序的压缩文件都是jar后缀 .jar

  • 对于web应用 那么他的压缩文件是 .war

  • 安装 【把5中生成的文件 jar文件或war文件安装到仓库之中】

  • 部署 【把程序安装好可以执行】

5、maven是如何管理jar包的

首先在【本地仓库】 —— >【私服】 ——> [镜像中央仓库]——->【中央仓库】

6、作用

  • 管理项目构建生命周期

  • 管理项目中的jar包

  • 管理项目中的基础信息(文档管理,测试报告)

7、maven的使用方式

  • 独立使用maven,使用maven的各种命令,完成代码的编译、测试、打包等。
  • 结合开发工具使用 在IDEA中使用maven 简单快捷 不需要记忆命令

二、安装和配置及核心

1、maven工具的安装和配置

需要从maven的官网下载maven的安装包 【用maven必须先配置好jdk】

maven官网

下载地址

  1. 8.1版本和3.5.4,下载不同版本只需要修改里面的内容即可
    https://mirror.nodesdirect.com/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip
    https://mirror.nodesdirect.com/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.zip

目录

  • bin 放可执行程序,主要是 mvn.cmd
  • conf setting.xml maven工具本身的配置文件

配置环境变量

  • 在系统的环境变量中指定一个 M2_HOME的名称,指定他的值是maven工具安装目录,bin之前的目录。

  • 把M2_HOME加入到path之中 %M2_HOME%\bin\

备注:遇到如下问题,可以采用如下方法配置

‘mvn’ 不是内部或外部命令,也不是可运行的程序
或批处理文件。

  1. 环境变量:
  2. MAVEN_HOME : D:\maven\apache-maven-3.5.4
  3. path: %MAVEN_HOME%\bin\
  4. maven的环境变量上移到紧挨着java环境变量(在java配置下面)

2、验证以下maven是否配置成功

在cmd窗口中输出 mvn -v【查看maven的版本】

注意 电脑上一定要有 JAVA_HOME JDK环境变量

出现以下内容说明maven配置成功

  1. Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
  2. Maven home: D:\maven\apache-maven-3.5.4\bin\..
  3. Java version: 1.8.0_91, vendor: Oracle Corporation, runtime: D:\Java\jdk1.8.0_91\jre
  4. Default locale: zh_CN, platform encoding: GBK
  5. OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

三、Maven核心概念

1、总体

  • POM

  • 一个文件 名称是pom.xml

  • pom翻译过来是项目对象模型

  • maven把一个项目当作一个模型使用,控制maven构建项目的过程,管理jar依赖

  • 约定的目录结构

  • maven项目的目录和位置是有规定的

  • 坐标

  • 是一个唯一的字符串,用来表示资源的。

  • 依赖管理

  • 用来管理你的项目中可以使用的jar包

  • 仓库管理

  • 资源存放的位置

  • 生命周期

  • maven构建项目的过程

  • 插件和目标

  • 执行maven构建的时候,用的工具是插件

  • 继承

  • 集合

2、maven约定的目录结构

每一个maven的项目在磁盘中都是一个文件夹

  • Hello/ // 项目名

  • **----/src**

  • ---------/main // 放置主程序目录

  • -----------------/java // 放程序的包 和包中的java文件

  • -----------------/resources //java程序中要使用的配置文件

  • ---------/test // 放测试程序代码和文件

  • -----------------/java // 放测试的包 和包中的java文件

  • -----------------/resources //测试程序中要使用的配置文件

  • **----/pom.xml** // maven的核心文件(必须有) 向maven要jar包

  • **----/target** // 编译后的class文件 不需要创建 maven命令在执行时自动创建

执行mvn compile【编译】 结果是在项目的根目录下自动生成target目录 【结果目录】 maven生成的class文件都存在于里面

3、仓库

3.1 修改本地仓库地址

本地仓库默认位置: C://用户/登录用户名称/.m2/resporsitory

修改本地仓库的位置

修改maven配置文件 conf/settings.xml

修改前先备份一份

  • 第二步 修改53行指定你的目录【不要使用中文目录】

  • E:\javaWeb\Maven\maven_repository

不要有中文,不要有空格

3.2 仓库是什么

  • 存放 maven使用的jar和我们项目中使用的jar

  • maven 使用的插件(各种jar)

  • 我们项目中使用的jar(第三方的工具)

3.3 仓库的分类

  • 本地仓库, 在计算机上的文件夹,存放各种jar

  • 远程仓库, 在互联网上使用网络才能使用的仓库

  • 中央仓库 最权威的,世界上所有的开发人员都共享使用的集中的仓库

https://repo.maven.apache.org

  • 中央仓库的镜像 在各大洲的重要城市中都有镜像,用户使用时,优先使用镜像
  • 私服 在公司内部 局域网中使用,不对外使用

3.4 仓库的使用

  • maven仓库的使用不需要人为参与
  • 开发人员使用mysql的驱动时—->maven首先查本地仓库——>查私服 ——> 中央仓库镜像——>中央仓库

4、POM 项目对象模型

pom.xml 文件 maven的核心

maven环境搭建好之后,所有的学习和操作都是关于pom.xml的

坐标【唯一值】

  • 为了方便maven对jar的定位,在maven的世界中,每一个jar都有一个独立的坐标,相当于ip

4.1 gav

  1. groupId 【自定义】组织id,一般是公司域名的倒写 com.yixuexi.autoStudy

  2. artifactId 【自定义】 项目名称 也是模块名称给 对应groupId中项目中的子项目【名字可以不一样】

  3. version 【自定义】版本号, 例如1.0.0 【-SNAPSHOT 后面添加表示快照】

这三个组成在一起就是一个坐标 【标识一个项目】

在互联网上唯一标识一个项目

https://mvnrepository.com 搜索使用的中央仓库, 使用groupId/artifactId作为搜索

为什么maven非要把坐标弄成唯一的?

  • 因为maven是想把所有的jar包都弄成世界上独一份,不会有重复。这样通过公司域名的倒写,和项目名外加 版本号组合在一起 就能保证这个jar包世上独一份
  • 这样的话在使用jar包的时候,就不会出现相同名称的jar包问题了

properties

  • 定义一些配置文件

bulid

  • 表示与构建相关的配置,例如设置jdk的版本

5、依赖

  1. <dependencies></dependencies>
  2. 依赖 在项目中用到的各种资源【jar包之类的】
  3. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  4. <dependency>
  5. <groupId>mysql</groupId>
  6. <artifactId>mysql-connector-java</artifactId>
  7. <version>5.1.47</version>
  8. </dependency>
  9. - 上面的信息来自于 中央仓库 , 把 g a v 复制到dependecies中即可
  10. - 相当于java中的import 可添加多个
  11. - maven用来管理jar包,使用依赖可以把jar包引入到项目中

maven生命周期/插件

生命周期:清理,编译,测试,报告,打包,安装,部署

插件:maven提供的功能,用来执行清理,编译……的一些程序

四、常见命令、插件

1、生命周期

maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署

2、常见命令

maven可以独立使用,通过命令来完成 maven 生命周期的执行

  • **mvn clean** 清除 删除当前工程中的target文件夹
  • **mvn compile** 编译 将当前工程中main文件夹下所有的java类编译为class,输送到target/classes中

同时把main/resources目录下的所有文件都拷贝到 target/classes目录下

  • **mvn test-compile** 编译测试文件 把编译好的测试文件放到 target/testclasses

  • **mvn test** 测试 调用maven工程下 test文件夹下,所有测试类的所有测试方法,并生成测试报告 【执行测试的之后,前面的都会自动做一遍】

  • **mvn package** 打包 先自己测试一遍【test中的java类】,没问题打成jar包或war包【class文件】, 输送到当前的target中去

  • **mvn install** 安装 和 mvn package基本一致, 只是将jar包/war包推送到maven本地仓库中

  • **mvn deploy** 部署

3、插件

maven命令执行时,真正完成功能的是插件【jar文件】

3.1 单元测试

  • 什么是单元测试

  • junit是一个专门测试的框架(工具)

  • 测试的是类中的方法,每一个方法都是独立测试的(都要写独立的测试方法)

  • 方法是测试的基本单位(单元)

  • maven借助单元测试,批量的测试类中的大量方法是否符合预期

3.2 如何使用?

  1. 加入依赖 pom.xml中加入单元测试依赖
  2. <!-- https://mvnrepository.com/artifact/junit/junit -->
  3. <dependency>
  4. <groupId>junit</groupId>
  5. <artifactId>junit</artifactId>
  6. <version>4.12</version>
  7. <scope>test</scope>
  8. </dependency>
  9. maven项目中的src/test/java目录下,创建测试程序

3.3 推荐方式

测试类的名称是 Test+要测试的类名

测试方法的名称是 test+要测试的方法名称

3.4 规则

  1. 方法是public

  2. 方法没有返回值

  3. 方法的名称是自定义的 推荐 test+要测试的方法名

  4. 方法的上面加上注解 @Test

3.5 验证

Assert.assertEquals(30,value) // 第一个参数是期望值,第二个参数为实际值

如果两个值 相等说明是正确,如果不等就抛出异常

main里面的包名在test中也要有,也就是说测试里面也按照 com.yixuexi

4、依赖管理

<scope></scope> 表示依赖使用的范围

在maven构建项目的那些阶段中起作用

清理,编译,测试,打包,安装,部署 【阶段】

<scope>``**test**``</scope> 表示在执行测试的时候才会起作用

scope的值有

  • 默认 **compile**

  • 所有的阶段都要用到,并不是只在编译阶段

  • **test**

  • **provided**

  • 提供者 【打包,安装时不需要】

5、maven的常用操作

maven的属性设置

properties 设置maven的常用属性

maven的全局变量

  • 自定义属性

  • 在properties中通过自定义标签 声明变量(标签名就是变量名)

  • <spring.version>1.1.2</spring.version>

  • 在pom.xml文件中的其他位置,使用 ${标签名} 使用变量的值

  • 自定义的作用

  • 一般是定义以来的版本号,当项目中使用多个相同的版本号,先使用全局变量定义,再使用${变量名}

资源插件

五、Maven版本管理

介绍版本

项目开发过程中,快照版本会正常发包,即每次拉取最新代码;正式版本第一次发版拉取代码,后续不会在更新发布,初次使用者还会奇怪代码没有发布成功,就是这个原因;需要更新代码,要修改正式版本号,如1.0修改为1.1或者1.2。

快照版本:1.0-SNAPSHOT

正式版本:1.0

版本RELEASE

Maven要求你每次更改了代码都要发布到仓库,然后其他人去仓库下载你的代码。

为了区分代码是否做了修改,引入了版本RELEASE概念

也就是你每次更改代码,修改你的版本,Maven会自动下载相对应的版本

只要在 <version>2.1.9.RELEASE</version>中以RELEASE为后缀就是版本
示例:

  1. <modelVersion>4.0.0</modelVersion>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-devtools</artifactId>
  4. <version>2.1.9.RELEASE</version>

版本规则

Maven主要是这样定义版本规则的:

<主版本>.<次版本>.<增量版本>
比如说1.2.3,主版本是1,次版本是2,增量版本是3。

主版本一般来说代表了项目的重大的架构变更,比如说Maven 1和Maven 2,在架构上已经两样了,将来的Maven 3和Maven 2也会有很大的变化。次版本一般代表了一些功能的增加或变化,但没有架构的变化,比如说Nexus 1.3较之于Nexus 1.2来说,增加了一系列新的或者改进的功能(仓库镜像支持,改进的仓库管理界面等等),但从大的架构上来说,1.3和1.2没什么区别。至于增量版本,一般是一些小的bug fix,不会有重大的功能变化。

指定版本的范围

Maven支持数学上“区间”的概念,用来指定依赖版本的一定范围,比如:

  1. <dependency>
  2. <groupId>log4j</groupId>
  3. <artifactId>log4j</artifactId>
  4. <version>[1.2.15,1.2.16]</version>
  5. </dependency>

意思是版本x:1.2.15<=x<=1.2.16

  1. # 控制依赖的版本范围:
  2. (,1.0]: x <= 1.0
  3. [1.2,1.3]: 1.2 <= x <= 1.3
  4. [1.0,2.0): 1.0 <= x < 2.0
  5. [1.5,): x >= 1.5
  6. # 同时声明多个版本范围也是可以的,只要用逗号分隔即可:
  7. (,1.0],[1.2,): x <= 1.0 或者 x >= 1.2
  8. # 当你不希望依赖某个版本的时候,可以声明为:
  9. (,1.1),(1.1,)
  10. # 假如你想使用某依赖的最新版,又懒于手动更新,可以设置区间这样
  11. [3.+,)[3.+,)

快照 SNAPSHOT

每次修改代码,都要发布版本,尤其是大型项目很多依赖jar时,会非常麻烦。
所以引入快照概念。

<version>1.0-SNAPSHOT</version>即为快照

快照版的jar,每次构建时会自动下载最新版的依赖,不需要手工更改版本号。

六、Maven 三种archetype说明

archetype

archetype:原型的意思,可理解为Maven项目模板工具包

常用archetype

  1. cocoon-22-archetype-webapp (很少使用)
  2. maven-archetype-quickstart (简单java项目)
  3. maven-archetype-webapp (web项目,多个模块只能存在一个)

maven提供的41个骨架原型

  1. maven提供的41个骨架原型分别是:
  2. 1: appfuse-basic-jsf (创建一个基于HibernateSpringJSFWeb应用程序的原型)
  3. 2: appfuse-basic-spring(创建一个基于HibernateSpringSpring MVCWeb应用程序的原型)
  4. 3: appfuse-basic-struts(创建一个基于HibernateSpringStruts 2Web应用程序的原型)
  5. 4: appfuse-basic-tapestry(创建一个基于HibernateSpring Tapestry 4Web应用程序的原型)
  6. 5: appfuse-core(创建一个基于HibernateSpring XFirejar应用程序的原型)
  7. 6: appfuse-modular-jsf(创建一个基于HibernateSpringJSF的模块化应用原型)
  8. 7: appfuse-modular-spring(创建一个基于Hibernate, Spring Spring MVC 的模块化应用原型)
  9. 8: appfuse-modular-struts(创建一个基于Hibernate, Spring Struts 2 的模块化应用原型)
  10. 9: appfuse-modular-tapestry (创建一个基于 Hibernate, Spring Tapestry 4 的模块化应用原型)
  11. 10: maven-archetype-j2ee-simple(一个简单的J2EEJava应用程序)
  12. 11: maven-archetype-marmalade-mojo(一个Maven 插件开发项目 using marmalade)
  13. 12: maven-archetype-mojo(一个MavenJava插件开发项目)
  14. 13: maven-archetype-portlet(一个简单的portlet应用程序)
  15. 14: maven-archetype-profiles(简单java项目)
  16. 15:maven-archetype-quickstart()
  17. 16: maven-archetype-site-simple(简单的网站生成项目)
  18. 17: maven-archetype-site(更复杂的网站项目)
  19. 18:maven-archetype-webapp(一个简单的Java Web应用程序)
  20. 19: jini-service-archetype(Archetype for Jini service project creation)
  21. 20: softeu-archetype-seam(JSF+Facelets+Seam Archetype)
  22. 21: softeu-archetype-seam-simple(JSF+Facelets+Seam (无残留) 原型)
  23. 22: softeu-archetype-jsf(JSF+Facelets 原型)
  24. 23: jpa-maven-archetype(JPA 应用程序)
  25. 24: spring-osgi-bundle-archetype(Spring-OSGi 原型)
  26. 25: confluence-plugin-archetype(Atlassian 聚合插件原型)
  27. 26: jira-plugin-archetype(Atlassian JIRA 插件原型)
  28. 27: maven-archetype-har(Hibernate 存档)
  29. 28: maven-archetype-sar(JBoss 服务存档)
  30. 29: wicket-archetype-quickstart(一个简单的Apache Wicket的项目)
  31. 30: scala-archetype-simple(一个简单的scala的项目)
  32. 31: lift-archetype-blank(一个 blank/empty liftweb 项目)
  33. 32: lift-archetype-basic(基本(liftweb)项目)
  34. 33: cocoon-22-archetype-block-plain([http://cocoapacorg2/maven-plugins/])
  35. 34: cocoon-22-archetype-block([http://cocoapacorg2/maven-plugins/])
  36. 35:cocoon-22-archetype-webapp([http://cocoapacorg2/maven-plugins/])
  37. 36: myfaces-archetype-helloworld(使用MyFaces的一个简单的原型)
  38. 37: myfaces-archetype-helloworld-facelets(一个使用MyFacesFacelets的简单原型)
  39. 38: myfaces-archetype-trinidad(一个使用MyFacesTrinidad的简单原型)
  40. 39: myfaces-archetype-jsfcomponents(一种使用MyFaces创建定制JSF组件的简单的原型)
  41. 40: gmaven-archetype-basic(Groovy的基本原型)
  42. 41: gmaven-archetype-mojo(Groovy mojo 原型)