
Maven
内容导航- Maven
- 构建项目
- 软件工程
- Maven工具的安装和配置
- Maven core
- POM 【program object model】项目对象模型
- 约定的目录结构 【maven编写项目的常见问题】
- 坐标gay
- 依赖管理【dependencies(管理)----> dependency(依赖从属)】
- 仓库管理
- 生命周期
- ....Maven常用的命令
- 插件
- 继承和聚合
- 单元测试框架Junit【测试方法】
Javaweb — 现在准备沉淀一下进入框架
Maven
JQuery虽然都说过时了,但是真的还是比JS高明了许多,特别是对于AJAX的简化;而JDK的动态代理则是基于反射实现了动态扩展而不改变原有的功能【但是必须要有接口】
maven是一个辅助的管理项目的工具【just 辅助】;最主要的功能–> 管理依赖(下载管理项目的jar包;Maven Repository: Search/Browse/Explore (mvnrepository.com);在这里面就可以找到;通过gruopId、artifactId、version可以唯一找到一个资源jar包);第二个便是项目的构建(编译、测试、打包、部署)
而其使用方式: 1. 通过命令行窗口使用lib命令完成比如编译命令【mvn -compile】来完成 *** 作 2.配置开发工具使用,比如IDEA、Eclipse,非常简单快捷
Maven在最开始写java的基础的简单的项目的时候,就会有提示,是否创建Maven,那么什么是Maven呢?
传统的项目 :
- 有很多模块、模块之间有关系、手工管理关系,比较繁琐
- 需要很多第三方功能,所以需要直到很多jar文件,需要从网络中获取各个jar,比如mysql,servlet等【jar文件中有很多的class类】
- 需要管理jar的版本,比如需要5.0,那就不能使用4.0的;因为版本冲突会出现问题
- 管理jar文件之间的依赖。比如要使用a.jar,必须使用b.jar中的类,必须要先得到b.jar,然后次啊能使用a.jar;a.jar和b.jar的关系就是依赖,就两者有关系就产生了依赖,比如a.jar依赖b.jar;项目依赖mysql驱动【因此开发项目需要对各jar包之间的依赖关系非常清楚,但这很耗费时间,所以如果能有工具帮忙就好了】
所以需要使用Maven来改进项目
- mavaen可以管理jar文件
- 自动下载jar和他的文档,源代码
- 管理jar直接的依赖,a.jar需要b.jar,maven会自动给下载b.jar
- 管理需要的jar的版本
- 自动编译程序和测试程序
- 帮助打包文件,形成jar文件、或者war文件
- 还能够帮助部署项目
这样开发者就只需要写功能代码即可
构建项目构建是面向过程的,就是一些步骤,完成代码的编译、测试、运行、打包、部署等;maven支持的有
- 清理 : 将之前项目的编译的文件删除,为新的编译代码做准备
- 编译 :把程序源代码编译为执行代码,java—>class文件【这是批量 *** 作,javac一次只能编译一个】
- 测试: maven可以只从测试程序代码,验证功能是否正确【批量 *** 作,同时测试多个测试代码,测试多个功能】
- 报告 : 生成测试结果的文件,测试是否通过的信息
- 打包: 将项目中的所有的class文件,配置文件等所有资源放到一个压缩文件中,如果都是普通的java程序,那么就是jar文件,web应用就是war文件 ---- 一个文件就是一个独立的功能了
- 安装 : 将5中生成的压缩文件安装到本机仓库
- 部署: 把项目安装好可以执行
再介绍这个知识之前,先来提出一个概念:软件工程【刚好下学期有这个课程,到时候会单独再介绍一下的】 日常生活中,有很多的工程项目,比如桥梁工程;工程就是各个行业的从业人员通过总结的规律和方法,以最小的代价做出最大的成效。 所谓的桥梁工程就是人们通过经验和总结得出的 — 用来建造桥梁最高效的方法,这种方法是可复用的。将这种思想抽象到软件领域,就变成了软件工程
软件工程 ---- 为了实现软件的流水线式生产,设计和构建软件时能够有一种规范和工程化的方法就是软件工程
完成一个java项目需要做的工作 :
分析项目的需求、分析功能 ----->设计项目,通过哪些步骤,使用哪些技术,需要多少人,多长的时间—> 组建团队、购置设备、服务器、…… ------> 开发人员需要测试自己的代码、重复多次的工作----> 测试人员进行测试 -----> 有问题返回给开发—>重复过程直到测试代码通过
Maven工具的安装和配置首先就是在官网下载maven,因为下载的java的版本就很新,所以这里就直接下载的最新版本,如果到时候不兼容再说,下载的网址放到这里: Maven – Download Apache Maven
第二步就是解压缩安装包了;这里将其解压到一个给中文的目录;解压之后就可以发现其约定的目录结构了;真的和tomcat有些类似,下面有bin、boot、cong、lib等文件夹 — bin目录就是程序执行的命令,最主要的就是mvn.cmd;再conf中存放的是配置文件settings;lib中iu是很多的jar文件,maven是用java编写的,所以一定要有JDK才能够正常运行
最后就是要配置环境变量: 在系统的环境中,指定一个MAVEN_HOME的名称,其值为maven的安装路径,不到bin; 之后再在系统路径中增加%MAVEN_HOME%bin 所谓的配置环境变量的目的就是为了更加方便执行程序的bin中的命令; 如果不配置只能到对应程序的bin目录下打开cmd窗口运行,配置之后就可以直接打开cmd窗口运行,从配置java、Mysql、Tomcat、Maven都是这个目的,先建立一个对应的HOME、路径为程序安装路径,bin的上一级目录; 之后再在路径中配置%?_HOME%/bin就算配置成功了
验证是否配置成功,就在cmd窗口中输入maven的命令, mvn -v
C:UsersOMEY-PC>mvn -v; Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537) Maven home: D:Mavenapache-maven-3.8.4 Java version: 16, vendor: Oracle Corporation, runtime: D:jdk-16 Default locale: zh_CN, platform encoding: GBK OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
需要注意的是,这里一定要要有JDK的路径,不然maven是无法正常执行的
Maven core POM 【program object model】项目对象模型可以看到这个xml文件的最高级的标签就是project --- 就是将项目给抽象成了一个模型 4.0.0
om.xml是Maven的核心;也就是将管理的项目看作一个模型
POM是一个文件,这个文件的名称为pom.xml;maven将一个项目当作一个模型来使用,通过这个文件可以控制maven构建项目的过程,管理jar的依赖;其中更可以配置各种标签,包括项目的坐标、JDK的版本、编译的encoding
其下由很多重要的标签
基本名称:
- modelVersion : Maven模型的版本,对于maven2和maven3来说,就是4.0.0;就是给项目设定的版本就是4.0
- groupId : 组织ID,一般是公司域名的倒写,格式可以是域名倒写或者域名倒写+项目名 : 比如com.baidu; com.baidu.appole; per.cfeng.ICQ
- artifactID: 项目的名称,也就是模块module的名称【最开始创建项目的时候就将一个项目看成一个module】对应的groupId下面的子项目,这也是唯一的
- version : 项目的版本号,如果项目还在开发中,是不稳定版本,通常就在版本后带-SHAPSHOT; version使用三位数字表示; 1.1.0 ---- 代表项目迭代的版本
- packaging : 项目打包的类型 ,可以是jar包,war包【web应用】、ear包、pom包,默认是普通的java程序jar包
依赖 : dependencies ---- 管理 和dependency — 从属,依赖, : 项目要使用的各种资源的说明,比如要使用mysql驱动
因为这个pom.xml就是项目对象模型,其中最大的标签就是project;代表就是项目
- dependencies : 项目管理的所有的从属jar包,也就是依赖,,比如这里可以演示在pom.xml中配置一个mysql驱动 ; 以后就不需要将jar包一个一个导入到项目了,直接使用maven管理即可
mysql mysql-connector-java8.0.27
配置属性
- properties : 这个标签用来定义一些配置属性的,比如project.build.sourceEncoding【项目的编码方式】,可以设置为UTF-8,防止中文乱码,也可以定义相关构建版本号,便于统一升级;比如Java的版本
16 16 UTF-8
构建
- build: 这个标签用来表示与构建相关的标签,比如设置编译插件的jdk版本,♂上面使用的是properties配置的
继承
- parent : 在maven中,如果多个模块(项目)都需要声明使用相同的配置,比如groupId、artifactId、version;有相同的依赖,或者相同的组件配置,也有java类似的java继承机制,用这个标签可以声明要继承的父类工程的pom配置
聚合
- modules : 在maven的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块的打包方式为pom,在其中使用modules聚合的其他模块,这样通过本模块就可以自动是被模块间的依赖关系构建所有的模块
maven项目的目录和文件的位置都是固定的,不能随意的创建— Tomcat也具有约定的目录结构,符合Servlet规范;也就是约定的目录结构就是规范,大家都是认可的 src【standard request code】标准要求代码
//比如这里创建一个工程项目Hello Hello |---src |---|---main |---|---|---java |---|---|---resources |---|---test |---|---|---java |---|---|---resources |---pom.xml
从这个结构可以看到:工程根目录下面就是src目录和pom.xml; 在src下面有main和test目录;每个目录下面都有java和resource目录
每一个maven的项目在磁盘中就是一个文件夹(项目);下面的二级目录就是
- src : code
- main #防止主程序的目录 主程序的java代码和配置文件
- java : #放置主程序包和包中的java文件
- resources#放置主java程序使用的配置文件
- test : # 放测试代码和文件的【可以没有】 ---- 测试在modelsim中可以看到非常常见
- java : #放置测试程序包和包中的java文件
- resources #放置测试java程序使用的配置文件
- main #防止主程序的目录 主程序的java代码和配置文件
- pom.xml maven的核心文件,maven项目必须有
maven执行的时候先进入pom.xml中;之后跳到main中执行主程序,再到test进行测试
使用mvn compile就可以编译项目的src下main的所有的java文件
这里可以演示一下maven管理项目的过程,这里就是使用普通的java程序
这里按照目录结构创建
4.0.0 cfeng maventest1.0-SNAPSHOT
上面就是maven的核心文件pom.xml的内容;这里不过多阐释【坐标就是项目的组织名,项目名称,项目的版本】
之后按照约定的目录结构来创建文件夹,创建好之后使用cmd的tree命令来查看文件的结构
PS D:Maven> tree Hello
D:MAVENHELLO
└─src
├─main
│ ├─java
│ └─resources
└─test
├─java
└─resources
这里在main的java目录中创建一个java文件
package cfeng;
public class HelloMaven{
public int add(int n1, int n2) {
return n1 + n2;
}
public static void main(String[] args) {
HelloMaven hello = new HelloMaven();
int res = hello.add(10,20);
System.out.println("10 + 20 = " + res);
}
}
然后使用maven命令mvn compile来编译main中所有的java文件;执行后可以发现
[INFO] Scanning for projects... [INFO] [INFO] --------------------------< cfeng:maventest >--------------------------- [INFO] Building maventest 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom (8.1 kB at 6.5 kB/s) ……………………………………
这里最主要就是一个下载过程,第一次编译会下载很久,Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/
- 为什么要进行下载呢?
因为maven是用java编写的,其中就有很多功能插件,需要进行下载才能正常使用;其实就是下载了很多jar文件;这些文件都是下载到本地仓库,这个本地仓库的默认地址是{user_HOME}/.me.repository【repository 仓库】----这里可以修改本地仓库的位置
- 从哪里下载呢?
https://repo.maven.apache.org : 中央仓库地址,所有的人都会使用这个地址
这里可能出错的地方就是忘记在pom.xml中写JDK的版本
[INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project maventest: Compilation failure: Compilation failure: [ERROR] 不再支持源选项 5。请使用 7 或更高版本。 [ERROR] 不再支持目标选项 5。请使用 7 或更高版本。 [ERROR] -> [Help 1]
这个时候就需要使用 java -version查看JDK的版本,之后再pom.xml中配置version
16 16
之后再次编译就可以成功了
D:MavenHello> mvn compile [INFO] Scanning for projects... [INFO] [INFO] --------------------------< cfeng:maventest >--------------------------- [INFO] Building maventest 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maventest --- [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maventest --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent! [INFO] Compiling 1 source file to D:MavenHellotargetclasses [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.276 s [INFO] Finished at: 2022-01-03T19:32:56+08:00 [INFO] ------------------------------------------------------------------------
可以看到这就编译成功了,并且耗时很短;但是这里还有一句警告: [WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent! ----- 解决的办法还是再pom.xml中加上标签
UTF-8
这样就可以no errors,no warnings
Compiling 1 source file to D:MavenHellotargetclasses ------> 将java中的java文件编译所放的位置;也就是生成了一个target文件夹在Hello下面【结果目录】
既然已经编译生成了class文件,那么就可以在classes目录处打开cmd窗口运行代码
PS D:MavenHellotargetclasses> java cfeng.HelloMaven 10 + 20 = 30坐标gay
gay 就是三个标签的总写,groupId,artifactId,version,项目在仓库的位置是用坐标决定的,artifactId和version指明了jar包的名称;三者一起指明了在仓库中的路径
坐标是一个唯一的字符串,用来表示资源 【 不是URI】
在上面的pom.xml中配置的基本信息中: groupId、artifactId、version 就被称为坐标,通过这个三个标签的值就就可以在互联网中唯一标识 一个项目
依赖管理【dependencies(管理)----> dependency(依赖从属)】cfeng maventest1.0-SNAPSHOT
可以管理项目中可以使用的jar文件; 一个Maven项目的正常运行需要其他项目的支持,maven会根据坐标到本地仓库查找,对于programmer自己的项目要安装才能保存到仓库
不用maven的时候所有的jar都不是可用的,需要从各地进行下载;直接写上坐标,maven会自动帮助下载
mysql
mysql-connector-java
8.0.27
junit
junit
4.11
仓库管理
资源存放的位置,就是项目构建中要完成装仓的过程
仓库 : repository是存放东西的,存放maven使用的jar(插件) 和 我们项目使用的jar(第三方驱动:mysql驱动、jackson工具)
Maven有几个重要的仓库
- 本地仓库: 个人计算机上的文件夹,存放各种jar,就是maven下载的资源等在本机中存放的位置,这个位置默认的是C盘的.me文件下的repository中;但是C盘太小,这个地址是可以修改的,在Maven的conf文件夹下的settings.xml中就可以修改【但是修改要注意备份,因为这种修改是危险 *** 作,事先进行备份】
D:/Maven/repository
移动仓库后,重新编译就会再次下载资源【jar包】
- 远程仓库:在互联网上的,使用网络才能够使用的仓库
- 中央仓库: 最权威的,所有的开发人员都共享使用的一个集中的仓库: https://repo.maven.apache.org;所有人都会访问,压力大
- 中央仓库的镜像mirror : 中央仓库的备份,在各大洲、重要的城市都是镜像,先到mirror中 ,找不到菜到中央仓库中寻找
- 私服 : 在公司内部,在局域网中使用的,不对外使用
仓库的使用:
maven仓库的使用不由programmer参与, 比如开发人员需要使用mysql驱动------> maven就查找本地仓库---->私服---->中央仓库的镜像mirror---->中央仓库; 如果本地仓库没有的,下载之后都会存在于本地仓库【所以仓库会越装越多】
搜索使用的中央仓库: Maven Repository: Search/Browse/Explore (mvnrepository.com); 在这里面就可以通过groupId、artifactId作为搜索条件进行搜索、比如搜索mysql的驱动: 搜索之后就可以搜到之前使用的连接器jar包,有各种版本供选择
生命周期maven项目构建项目的过程: 包括清理、编译、测试、报告、打包、安装、部署
对项目的构建是建立在生命周期的模型上的,它明确定义项目生命周期的各个截断,对于每一个阶段提供相对应的命令;对于programmer来说,无论进行哪个阶段的构建,直接执行相应的命令即可,无需担心前一阶段是否构建,Maven会自动构建
…Maven常用的命令maven可以单独使用,通过命令,可以完成maven生命周期的执行,完成项目的清理,编译,测试等
插件执行maven构建的时候使用的工具就是插件
maven命令执行的时候,真正完成功能的就是插件,所谓的插件就是一些jar文件【一些java类】
继承和聚合继承: 在maven中,如果多个模块(项目)都需要声明使用相同的配置,比如groupId、artifactId、version;有相同的依赖,或者相同的组件配置,也有java类似的java继承机制,用这个标签可以声明要继承的父类工程的pom配置
聚合: 在maven的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块的打包方式为pom,在其中使用modules聚合的其他模块,这样通过本模块就可以自动是被模块间的依赖关系构建所有的模块
单元测试框架Junit【测试方法】junit就是一个专门测试的框架,测试的内容 : 测试的是类中的方法,每一个方法都是独立测试的,方法是测试的基本单位
Maven可以借助借助单元测试插件【工具】批量测试大量方法是否符合预期
使用的步骤:
- 在pom.xml中加入单元测试的依赖
- 在maven的项目中的src/test/java目录下,创建测试程序 — 推荐的创建类和方法的提示 — 测试的名称: Test + 要测试的类名; 测试的方法的名称: Test + 方法名称【比如要测试HelloMaven】
TestHelloMaven
@Test
public void testAdd(){
//测试方法是否正确
}
//testAdd是测试方法,它的定义规则
1. 在方法上面加上@Test
2. 方法没有返回值,必须是void
3. 方法必须是public的
4. 方法命名就是test + 方法名
这里的剩下的明天会补充的
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)