写在前面,下图是本章涉及知识的思维导图
用心记录,感谢赏识~~~
目录
- 1.maven核心概念
- 2.maven生命周期
- 3.maven仓库
- 4.pom文件
- 5.maven生命周期
- 6.maven命令+插件之间的关联
- 7.单元测试junit
- 8.使用maven命令及生命周期插件
-
(1)maven的编译——mvn compile
-
(2)maven的清理——mvn clean
-
(3)maven的测试编译——mvn test-compile
-
(4)maven的测试:mvn test
-
(5)maven的打包:mvn package
-
(6)maven的安装:mvn install
-
(7)maven的部署:mvn deploy
-
- 9.总结
1.maven核心概念
①POM:一个文件名称是pom.xml , pom翻译过来叫做项目对象模型,maven把一个项目当做一个模型使用。控制maven构建项目的过程,管理jar依赖。
②约定的目录结构:maven项目的目录和文件的位置都是遵循规范的。
③项目坐标:唯一的字符串,用来表示项目资源的。
④依赖管理:管理项目可以使用jar包文件。
⑤仓库管理:jar包文件资源存放的位置。
⑥生命周期:maven工具构建项目的过程。
⑦插件和目标:执行maven构建的时候用的工具是插件。
⑧继承(本教程不说):一个 maven 项目可以继承另一个 maven 的依赖, 称为子项目父项目。
⑨聚合(本教程不说):父类型的模块,不需要有源代码和资源文件,也就是说,没有 src/main/java 和 src/test/java目录。Maven会首先解析聚合模块的POM文件,分析要构建的模块,并通过各模块的依赖关系计算出模块的执行顺序,根据这个潜在的关系依次构建模块。
2.maven生命周期
maven生命周期(项目构建的过程):对项目进行清理、编译、测试、报告、打包、安装、部署上传到私服的过程。
- 清理(mvn clean):它删除在构建编译和测试时在项目目录中生成target目录的文件。但是已经install到仓库里的包不会删除。
- 编译(mvn compile):maven可以批量的把程序源代码编译为执行代码(.java编译成.class),maven可以同时把成千上百的文件编译为class,javac不一样,javac一次编译一个文件。在pom.xml同级目录下生成target目录存放主程序编译之后的.class字节码文件。
- 测试编译(mvn test-compile):maven可以批量的同时执行测试程序代码以及测试功能,验证功能正确性,在pom.xml目录下生成target目录存放主程序编译之后的.class字节码文件。
- 测试(mvn test):maven可以批量的同时测试很多功能,在pom.xml同级目录下生成surefire-reports目录,保存测试结果。
- 报告:生成测试结果的文件存放在surefire-reports目录,测试通过没有。
- 打包(mvn package):把你的项目中src/main/java目录下所有的.class文件,src/main/resources目录下配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件,通常java程序,压缩文件是.jar扩展名的。对于web应用,压缩文件扩展名是.war。总而言之,会把编译、编译测试、测试、并且按照pom.xml配置把主程序打包生成jar包或者war包。
- 安装(mvn install):把打包(mvn package)中生成的文件jar、war安装到本地仓库。会把本工程打包,并且按照本工程的项目坐标(三个参数)保存到本地仓库中。
- 部署(mvn deploy):程序安装后可以执行,把本工程打包,按照本项目工程的项目坐标(三个参数)保存到本地仓库中,并且还会保存到私服仓库中以及自动把项目部署到web容器中。
注意:执行以上命令必须在命令行进入pom.xml所在目录!
3.maven仓库
(1)什么是maven仓库?
maven仓库是存放东西的,存放maven下载jar包和项目调用的jar包。
——maven使用的插件(各种jar包)
——项目使用的jar包(第三方的工具)
(2)仓库的分类
- 本地仓库: 用户个人计算机上的文件夹,存放各种jar包——使用地址是本机电脑磁盘上自定义盘符路径,默认地址路径是.m2
- 远程仓库:在互联网上使用网络才能使用的仓库,如mvnrepository、apache、aliyun等中央仓库。
——中央仓库:最权威的,全球开发人员都共享使用的一个集中的maven仓库。
中央仓库资源地址:https://mvnrepository.com/
——镜像中央仓库:中央仓库的备份,在各大洲,重要的城市都有镜像资源地址。
如阿里云的maven镜像的中央仓库:
http://maven.aliyun.com/nexus/content/groups/public/
http://maven.aliyun.com/nexus/content/repositories/central/
- 私服仓库:在公司或组织内部局域网中使用,不对外使用。安全性高,通过网络访问私服仓库。
(3)仓库的使用——maven仓库调用不需要人为参与的。
开发人员获取jar资源(项目工程需要使用的jar,mysql驱动等资源)——>首先查找maven自定义本地仓库(本机电脑的文件夹目录)——>私服maven(公司组织局域网服务器)——>镜像中央仓库(aliyun、apache国内服务器)——>中央仓库(mvnrepository外国服务器)
说明:仓库使用顺序,本机(地)仓库没有的话,去私服查找,有的话就拷贝一份到本机(地)仓库。如果私服没有的话,就去镜像中央仓库查找,有的话,就拷贝分别拷贝一份到私服中央仓库和本机(地)仓库中。以此类推,直到外服中央仓库中查找,若外服中央仓库没有的话,说明开发人员需要调用的jar资源不存在,有的话就分别拷贝到各种级别的仓库中,供给开发人员离线调用开发资源,提高开发效率。
5.pom文件
pom.xml是maven的核心文件,是maven的灵魂。
生成结构说明:
(1)modelVersion:Maven模型的版本,对于Maven2和Maven3来说,它只能是4.0.0。
<modelVersion>4.0.0</modelVersion>
(2)groupId:组织id,一般是公司域名的倒写。格式可以为:
——域名倒写。例如com.baidu
——域名倒写+项目名。例如com.baidu.projectname
<groupId>com.baidu</groupId>
<groupId>com.baidu.projectname</groupId>
(3)artifactId:项目名称,也是模块名称,对应groupId中项目中的子项目
<artifactId>projectname</artifactId>
(4)version:项目版本号。如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOT,version使用三位数字标识,例如1.1.0。
<version>1.0-SNAPSHOT</version>
(5)gav:以上的groupId、artifactId、version三个元素合并在一起统称为项目坐标,项目坐标具有唯一性,称之为唯一值,在互联网中唯一标识一个项目的,在中央仓库中就是根据项目坐标的唯一值,在资源库中搜索下载相应的jar包。
<groupId>公司域名的倒序</groupId>
<artifactId>自定义项目名称</artifactId>
<version>自定义版本号</version>
例如,想要在中央仓库中获取mysql连接驱动,必须在pom.xml中声明mysql连接驱动在仓库中唯一性项目坐标搜索下载jar包。搜索地址:https://mvnrepository.com/,键入mysql关键字。
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
(6)packaging:项目打包的类型,可以是jar、rar、ear、pom,web应用是war, packaging可以不写,默认是jar。
(7)dependencies和dependency(依赖):项目中要使用的各种资源说明,比我的项目要使用mysql驱动,Maven的一个重要作用就是管理jar包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的jar包,在 Maven中,这些jar就被称为依赖,使用标签dependency来配置。而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出,maven把所有的jar包也都视为项目存在了。
依赖也有自己的项目坐标,用作中央仓库唯一值标识。
<!-- 依赖 相当于java代码中的 import -->
<dependencies>
<!--mysql的依赖 https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--单元测试程序的依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
(8)properties:properties是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。
<!--配置属性 -->
<properties>
<!--构建源码编码方式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--jdk版本 -->
<java.version>1.8</java.version>
<!--maven构建版本号 -->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
(9)build:表示与构建相关的配置,例如设置编译插件的jdk版本、插件配置等。
例如,使用maven项目骨架快速创建java项目时,会自动生成一堆的maven生命周期的插件,都放在build中:
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
6.maven命令+插件之间的关联
- maven命令:maven独立使用,通过命令,完成maven的生命周期的执行。maven可以使用命令,完成项目的清理,编译,测试等等。
- maven的插件:maven命令执行时,真正完成功能的是插件,插件是一些jar文件,一些类。
换言之,想要完成maven生命周期的清理,编译,测试,报告,打包,安装,部署等功能,就得通过使用maven命令去调用maven插件,由插件执行完成清理,编译,测试,报告,打包,安装,部署等功能。因此它们三个是一个不可分割的整体。
7.单元测试junit
单元测试:用的是junit,是一个专门测试的框架(工具)。
junit测试内容:测试的是类中的方法,每一个方法都是独立测试的。方法是测试的基本单位(单元)。
maven借助单元测试,批量测试类中的大量方法是否符合预期的。
使用步骤:
(1)在pom.xml中加入依赖
<!--单元测试程序的依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
(2)在maven项目中的src/test/java目录下,创建测试程序。
推荐的创建类和方法的提示:
——测试类的名称是Test +你要测试的类名
——测试的方法名称是:Test +方法名称
例如:想要测试HelloMaven.java
——创建测试类:TestHelloMaven
@Test
public void testAdd(){
测试He1loMaven的add方法是否正确
}
其中testAdd叫做测试方法,它的定义规则遵循以下4点:
——方法是public的,必须的。
——方法没有返回值,,必须的
——方法名称是自定义的,推荐是Test +方法名称
——方法的上面加入@Test
(3)创建HelloMaven.java,如下:
package com.zhangsong.maventest;
/**
* created by on 2021/7/22
* 描述:Manven——单元测试类
*
* @author ZSAndroid
* @create 2021-07-22-12:07
*/
public class HelloMaven {
public static void main(String[] args) {
HelloMaven helloMaven = new HelloMaven();
int addValue = helloMaven.add(100, 200);
System.out.println("100+200计算结果=" + addValue);
}
/**
* 计算两个整数之和的方法
* @param a 第一个数
* @param b 第一个数
* @return
*/
public int add(int a, int b) {
return a + b;
}
}
(4)创建TestHelloMaven.java,如下:
package com.zhangsong.maventest;
import org.junit.Assert;
import org.junit.Test;
/**
* created by on 2021/7/22
* 描述:Maven——单元测试类
*
* @author ZSAndroid
* @create 2021-07-22-12:13
*/
public class TestHelloMaven {
@Test
public void testAdd() {
System.out.println("maven junit 执行了testAdd()!");
HelloMaven helloMaven = new HelloMaven();
int testAddValue = helloMaven.add(100, 200);
//验证100+200是不是300 ,junit提供的方法,对比结果的
//assertEquals(期望值,实际值),如果两个值相等证明是正确的,不相等就抛出异常==等于==错误
Assert.assertEquals(300, testAddValue);
}
}
到这里maven的junit单元测试类已经创建成功,下面结合maven常用命令(生命周期插件)一起使用,实践一下。
8.使用maven命令及生命周期插件
(1)maven的编译——mvn compile
maven命令编译之前:maven.txt随便创建的资源文件
maven使用命令编译后:mvn compile
maven命令的mvn compile编译功能由两个插件完成,分别是:
maven-resources-plugin-2.6.jar
maven-compiler-plugin-3.1.jar
——maven-resources-plugin-2.6.jar:把src/main/resources/所有资源文
件同时拷贝到mvn compile编译的target根目录下。
——maven-compiler-plugin-3.1.jar:编译src/main/所有java源程序,编译之后
生成xxx.class字节码文件同时拷贝存放到mvn compile编译的target/classes/包
名(com.zhangsong.maventest)目录下。
(2)maven的清理——mvn clean
maven命令清理之前:target目录是mvn compile编译生成的目录,执行mvn
clean,将会删除target目录(打包存放到本地仓库或本机仓库文件夹的jar包资源
不会被删除)。mvn命令的mvn clean清理功能由插件完成。
maven-clean-plugin:2.5.jar
删除target目录及其中存放所有同时拷贝的.class和资源文件。
(3)maven的测试编译——mvn test-compile
由两个插件
maven-resources-plugin-2.6.jar
maven-compiler-plugin- 3.1.jar
与mvn compile使用插件相同,区别是编译的文件不同,生成的.class和
resources存放目录不同。
首先,我们要明确为什么要测试编译?
在java语言中,编译时和运行时是不同时期独立进行的。因此这里,通过maven
命令测试编译+junit单元测试进行编译时期测试程序。搞清楚这一点,咱们继续。
而上面4部分(单元测试junit)中测试类TestHelloMaven.java已经创建,而它只
是.java源程序,要编译成.class字节码文件,才能测试程序。
测试程序编译后同时拷贝到target/test-classes/包名(com.zhangsong.maventest)目录中
(4)maven的测试:mvn test
由一个插件完成测试程序的功能。
maven-surefire-plugin:2.12.4.jar
根据maven生命周期特性,当mvn test命令执行时,会再次执行mvn compile命
令以及mvn test-compile命令,就是再次从生命周期头部开始执行。因此,当我
们使用mvn test时,其实已经自动编译或拷贝src/main/所有资源和src/test/所有
资源到target对应的classes目录下或test-classes目录下。
使用mvn test不论 BUILD SUCCESS(构建成功) 或者 BUILD FAILED(构建
失败)都会在target目录中生成一个测试报告的目录target/surefire-reports,用
作记录mvn test测试的结果信息测试报告文件分别用一个.txt文件和一个.xml文件
记录。记录信息有:
Tests run(测试个数)
Failures(测试失败数)
Errors(测试错误数)
skipped(测试跳过数)
elapsed(测试时间)
如:
(5)maven的打包:mvn package
把编译mvn compile、编译测试mvn test-compile、测试mvn test、并且按照
pom.xml配置把主程序打包生成jar包或者war包。
maven命令mvn package由一个插件完成打包。
maven-jar-plugin-2.4.jar
生成jar包名称由项目坐标的artifactId-version.jar来统一规范命名,这是maven
默认规范,不建议更改。如:HelloMaven-1.0-SNAPSHOT.jar。
<artifactId>HelloMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包格式-->
<packaging>jar</packaging>
对mvn package打包生成HelloMaven-1.0-SNAPSHOT.jar文件说明
目录结构:仅打包src/main中的所以资源(java目录+resources目录)和
pom.xml等版本参数信息,其它目录资源不打包。
mvn package--->HelloMaven-1.0-SNAPSHOT.jar
│
├──com
│ └─zhangsong
│ └─maventest(路径:\com\zhangsong\maventest\)
│ └─HelloMaven.class(拷贝src/main/java/所有源代码)
│
└──META-INF
│ └─maven
│ │ └─com.zhangsong.maventest
│ │ └─HelloMaven(路径:\META-INF\maven\com.zhangsong.maventest\HelloMaven\)
│ │ └─pom.properties(打包时的时间和项目坐标的三个参数)
│ │ │
│ │ └─pom.xml(打包时拷贝项目工程的pom.xml)
│ │
│ └─MANIFEST.MF(打包时的清单版本、和存档版本、maven版本、jdk版本、操作打包的账户名【C盘User名称】)
│
│
└──maven.txt(拷贝src/main/resources/所有资源文件)
——HelloMaven.class对应src/main/java/所有源代码
——pom.properties文件:打包时的时间和项目坐标的三个参数,内容如下:
#Generated by Maven
#Thu Jul 22 17:00:39 CST 2021
version=1.0-SNAPSHOT
groupId=com.zhangsong.maventest
artifactId=HelloMaven
——pom.xml文件:内容与项目工程pom.xml一样。
<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>
<groupId>com.zhangsong.maventest</groupId>
<artifactId>HelloMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包格式-->
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--单元测试程序的依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
——MANIFEST.MF目录:打包时的清单版本、和存档版本、maven版本、jdk版
本、操作打包的账户名【C盘User名称】
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: ZSAndroid
Created-By: Apache Maven 3.8.1
Build-Jdk: 1.8.0_152
——maven.txt文件:拷贝src/main/resources/所有资源文件
(6)maven的安装:mvn install
maven-install-plugin
安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中。方便某
些重要项目离线保存或某些组织共享资源。
执行mvn install,也要把compile、test-compile、test、package四个生命周
期重复执行一次,每个周期命令对应的功能也会自动执行。
安装在本地仓库中的jar包位置和名称如何确定呢?
——位置是路径,路径取决去项目坐标3个参数的拼接。拼接时,遇到“.”就分
割成文件夹。\com\zhangsong\maventest\HelloMaven\1.0-SNAPSHOT
——名称是artifactId-version.jar(固定规范)
安装在本地仓库中的jar如何引用呢?
——在非当前项目的pom.xml中的依赖处,引入该jar包项目坐标即可。
<dependencies>
<!--本地仓库jar包项目坐标 -->
<dependency>
<groupId>组织名</groupId>
<artifactId>模块名</artifactId>
<version>版本号</version>
</dependency>
<!--本地仓库HelloMaven-1.0-SNAPSHOT.jar包项目坐标 -->
<dependency>
<groupId>com.zhangsong.maventest</groupId>
<artifactId>HelloMaven</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
(7)maven的部署:mvn deploy
涉及到服务器搭建和web配置,这里就不介绍了,因为俺也不会~~~
9.总结
仅自己学习记录,如有错误,敬请谅解~,谢谢~~~