写在前面,下图是本章涉及知识的思维导图
用心记录,感谢赏识~~~
(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
①POM:一个文件名称是pom.xml , pom翻译过来叫做项目对象模型,maven把一个项目当做一个模型使用。控制maven构建项目的过程,管理jar依赖。
②约定的目录结构:maven项目的目录和文件的位置都是遵循规范的。
③项目坐标:唯一的字符串,用来表示项目资源的。
④依赖管理:管理项目可以使用jar包文件。
⑤仓库管理:jar包文件资源存放的位置。
⑥生命周期:maven工具构建项目的过程。
⑦插件和目标:执行maven构建的时候用的工具是插件。
⑧继承(本教程不说):一个 maven 项目可以继承另一个 maven 的依赖, 称为子项目父项目。
⑨聚合(本教程不说):父类型的模块,不需要有源代码和资源文件,也就是说,没有 src/main/java 和 src/test/java目录。Maven会首先解析聚合模块的POM文件,分析要构建的模块,并通过各模块的依赖关系计算出模块的执行顺序,根据这个潜在的关系依次构建模块。
maven生命周期(项目构建的过程):对项目进行清理、编译、测试、报告、打包、安装、部署上传到私服的过程。
注意:执行以上命令必须在命令行进入pom.xml所在目录!
(1)什么是maven仓库?
maven仓库是存放东西的,存放maven下载jar包和项目调用的jar包。
——maven使用的插件(各种jar包)
——项目使用的jar包(第三方的工具)
(2)仓库的分类
——中央仓库:最权威的,全球开发人员都共享使用的一个集中的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资源不存在,有的话就分别拷贝到各种级别的仓库中,供给开发人员离线调用开发资源,提高开发效率。
pom.xml是maven的核心文件,是maven的灵魂。
生成结构说明:
(1)modelVersion:Maven模型的版本,对于Maven2和Maven3来说,它只能是4.0.0。
4.0.0
(2)groupId:组织id,一般是公司域名的倒写。格式可以为:
——域名倒写。例如com.baidu
——域名倒写+项目名。例如com.baidu.projectname
com.baidu
com.baidu.projectname
(3)artifactId:项目名称,也是模块名称,对应groupId中项目中的子项目
projectname
(4)version:项目版本号。如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOT,version使用三位数字标识,例如1.1.0。
1.0-SNAPSHOT
(5)gav:以上的groupId、artifactId、version三个元素合并在一起统称为项目坐标,项目坐标具有唯一性,称之为唯一值,在互联网中唯一标识一个项目的,在中央仓库中就是根据项目坐标的唯一值,在资源库中搜索下载相应的jar包。
公司域名的倒序
自定义项目名称
自定义版本号
例如,想要在中央仓库中获取mysql连接驱动,必须在pom.xml中声明mysql连接驱动在仓库中唯一性项目坐标搜索下载jar包。搜索地址:https://mvnrepository.com/,键入mysql关键字。
mysql
mysql-connector-java
5.1.38
(6)packaging:项目打包的类型,可以是jar、rar、ear、pom,web应用是war, packaging可以不写,默认是jar。
(7)dependencies和dependency(依赖):项目中要使用的各种资源说明,比我的项目要使用mysql驱动,Maven的一个重要作用就是管理jar包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的jar包,在 Maven中,这些jar就被称为依赖,使用标签dependency来配置。而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出,maven把所有的jar包也都视为项目存在了。
依赖也有自己的项目坐标,用作中央仓库唯一值标识。
mysql
mysql-connector-java
5.1.38
junit
junit
4.11
test
(8)properties:properties是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。
UTF-8
1.8
1.8
1.8
(9)build:表示与构建相关的配置,例如设置编译插件的jdk版本、插件配置等。
例如,使用maven项目骨架快速创建java项目时,会自动生成一堆的maven生命周期的插件,都放在build中:
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-jar-plugin
3.0.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
maven-site-plugin
3.7.1
maven-project-info-reports-plugin
3.0.0
换言之,想要完成maven生命周期的清理,编译,测试,报告,打包,安装,部署等功能,就得通过使用maven命令去调用maven插件,由插件执行完成清理,编译,测试,报告,打包,安装,部署等功能。因此它们三个是一个不可分割的整体。
单元测试:用的是junit,是一个专门测试的框架(工具)。
junit测试内容:测试的是类中的方法,每一个方法都是独立测试的。方法是测试的基本单位(单元)。
maven借助单元测试,批量测试类中的大量方法是否符合预期的。
使用步骤:
(1)在pom.xml中加入依赖
junit
junit
4.11
test
(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常用命令(生命周期插件)一起使用,实践一下。
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)目录下。
maven命令清理之前:target目录是mvn compile编译生成的目录,执行mvn
clean,将会删除target目录(打包存放到本地仓库或本机仓库文件夹的jar包资源
不会被删除)。mvn命令的mvn clean清理功能由插件完成。
maven-clean-plugin:2.5.jar
删除target目录及其中存放所有同时拷贝的.class和资源文件。
由两个插件
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)目录中
由一个插件完成测试程序的功能。
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(测试时间)
如:
把编译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。
HelloMaven
1.0-SNAPSHOT
jar
对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一样。
4.0.0
com.zhangsong.maventest
HelloMaven
1.0-SNAPSHOT
jar
UTF-8
junit
junit
4.11
test
——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/所有资源文件
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包项目坐标即可。
组织名
模块名
版本号
com.zhangsong.maventest
HelloMaven
1.0-SNAPSHOT
涉及到服务器搭建和web配置,这里就不介绍了,因为俺也不会~~~
仅自己学习记录,如有错误,敬请谅解~,谢谢~~~