一、什么是Maven
Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标 (goal)的逻辑。
二、Maven有什么用
1、以将一个项目拆分成多个工程。
2、可以将 jar 包仅仅保存在“仓库”中,有需要使用的工程,只需要引用这个 jar 文件即可, 不需要将 jar 包文件复制过来。
3、下载jar包。
4、引入一些 jar 包时,该 jar 包运行所依赖的相关 jar 包会一同被加入到工程中。比如说在spring项目中加入依赖spring-context。
三、Maven安装配置1、下载安装
maven的安装下载可以在apache官方找到,推荐使用稳定版,下载地址在这儿➡https://maven.apache.org/download.cgi。下载下来应该是一个压缩包,解压到指定位置即可。
2、配置环境变量
在系统属性中找到“环境变量”(都到maven了应该都知道咋整),新建一个MAVEN_HOME,值为解压后的文件位置,然后在PATH中配置一个Maven下bin目录的环境变量。配置完成后检查是否配置成功。
当然也可以查看更多的mvn指令,在bin目录下有多个maven的指令,这就是配置环境变量的原因。
3、本地仓库和远程仓库
默认maven会把仓库放在用户下的/.m2/respository下,为了防止再多下一点jar包C盘就会爆炸,我们更改一下本地仓库的位置,在maven的conf目录下有一个settings.xml的文件,打开之后找到localRespository,上边有英文注释,可以看见默认的仓库位置,更改标签内的值为你想存放的仓库的位置,以后就会下载到这个文件夹里面了。
更改完本地仓库之后我们可以顺便配置一个国内的镜像源,毕竟服务器在国外下载东西可能有限制,所以增加一个阿里云的,直接将下面的复制到标签之间即可。
nexus-aliyun central Nexus aliyun http://maven.aliyun.com/nexus/content/groups/public
更改完成之后别忘了把更改好的settings.xml文件放到用户/.m2文件夹下。
4、在Idea下配置maven
在idea的settings中搜索maven,并配置主路径(解压后的文件)、用户设置文件(刚才复制到.m2下的文件)和本地仓库的位置,后两项可以根据自己的喜好重写更改。
四、创建Maven项目并添加依赖1、创建项目
选择new->project,选择maven项目,可以看见内部提供了多个框架(包括webapp等),当然可以不从模板创建。
根据上面的提示写写项目的配置下就行了。
名称:工程名
位置:工程所在的地址
组ID:一般是域名倒置
工件ID:模块的名字,一个工程可能有多个模块
版本:snapshot-临时版本release-稳定版
创建好的maven项目包含以下文件夹:
1、src 目录:用于放置程序开发人员编写的 java 源程序代码
2、pom.xml 文件:Maven 工程的核心配置文件
3、main 目录:存放主程序的目录
4、test 目录:存放测试程序的目录
5、java 目录:存放 Java 源程序文件
6、resources 目录:存放框架或其他工具的配置文件
2、添加依赖并测试
在中添加标签,格式如下,dependencies中包含多个dependency。这里以springframework为例。
springframework spring-orm 1.2.6
如果你的本地仓库没有这个jar包,就会出现以下爆红的情况,点击下图这个m的符号加载maven变更就好了,idea会自动给你下载缺少的jar包。
当然不是所有的依赖我们都知道它的ID和版本,所以推荐使用工具网站 https://mvnrepository.com/ 查询所需要的依赖,直接复制其中的maven依赖的文本粘贴到配置文件中即可。(当然也可以使用阿里云云效maven)
编写一个测试类输出文本,编译后的class文件会放到target目录下,如果想重新编译,可以在生命周期中点击clean即可清除编译后的class文件。
五、maven生命周期
mvn compile:编译 maven 工程
mvn test-compile:编译测试代码
mvn test:运行应用程序中的单元测试
mvn clean:清除目标目录中的生成结果
mvn package: 依据项目生成 jar 文件
mvn install:将打包后的 jar 包安装到本地库中
mvn deploy:将 jar 包发布到远程仓库
mvn site:生成站
可以直接在Idea的终端(或者在项目文件夹下启动dos窗口)输入指令,
不过Idea已经提前将这些指令放到了右面的maven菜单栏的生命周期里
六、Maven的依赖1、坐标
在 Maven 中使用下面三个向量在仓库中唯一定位一个 Maven 项目
1、Group Id:Group 就是公司或者组织的含义,Group Id 的值使用公司或组织的域名倒序+项目名称。
2、Artifact Id:Artifact 就是工艺品的意思,Artifact Id 的值采用模块的名称来描述。
3、Version:版本号,一个项目或者模块在软件开发中也是会经过多次迭代的,每次迭代会产生一个版本号
2、仓库
仓库就是存储在开发过程中使用到的第三方的 Jar 包的地方,在 Maven 中仓库分为本地仓库于远程仓库。
本地仓库:当前电脑本机上存储的所有的 Maven 的第三方的工程。
远程仓库:远程仓库又分为,私服、中央仓库、中央仓库的镜像
1、私服:架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务。
2、中央仓库:架设在 Internet 上,为全世界所有的 Maven 工程服务。
3、中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户的请求。
仓库中存储的文件分为三类:
1、Maven 工具自身所需要的插件。
2、第三方框架的 jar 包。
3、程序员自己开发 的 Maven 工程。
⬇️普通情况下下载jar包的方式
⬇️不连接外网方式下载jar包
3、依赖的范围、传递和排除范围
在引入junit的依赖时,我们可以看到相比其他依赖多了一个标签,该标签的含义就是范围的意思。
junit junit 4.12 test
scope标签中可能有如下值:
? test:在测试范围内有效,打包的时候,该范围的 jar 包不会被打入到工程中。
? compile:在编译、打包、发布范围内有效,打包的时候,该范围内的 jar 包会被打入到工程中。
? provided:主要是针对 web 工程,在生成 war 包时不会加入,例 如:servlet-api,这个包 tomcat 会为我们自动的提供,所以不需要。
默认情况下值为compile。
传递和排除
在开发项目时可能会同时开发多个模块,或者一个人开发的模块A要依赖于别人开发的模块B,那我们就不得不考虑两个模块的依赖传递关系或者AB内的依赖是否会造成冲突。
⬇️我们可以通过maven生命周期的install将自己写好的模块打包并安装到当前的项目文件夹下
如果模块A依赖lombok、junit和mysql-connector,模块B依赖于模块A,则二者的关系如下:
B只依赖A,但是在maven选项的以来中却能找到mysql和lombok的依赖却没有junit的依赖,即非complie不会传递。
如果B依赖A包,但是A又依赖C包的c,c会让B不可用,我们在A模块的dependecy标签中可以使用如下的方式控制c不让其传递到B。即A既用了C又没有用c。
org.exampleC5.2.7.RELEASE org.examplec
4、依赖传递原则
Maven 工程的依赖遵循以下两种原则,
1、路径最短者优先。
如上图所示,工程 A 依赖于工程 B,工程 B 依赖于工程 C,工程 C 依赖 log4j.1.2.17 版本,而工程 B 由于某些 原因需要依赖 log4j.1.2.14 版本,根据依赖的传递性对于工程 A 来说,根据路径最短者优先原则会导入 log4j.1.2.14, 这是因为对于工程 A 来说导入 log4j.1.2.17 版本来说需要三步,从 A 到 B,从 B 到 C,从 C 到 log4j.1.2.17。而导入 log4j.1.2.14 来说只需要两步,从 A 。
2、路径相同时先声明者优先原则
com.ls工程 Bcom.ls工程 C
上图所示,工程 A 既依赖于工程 B,同时也依赖于工程 C,而工程 B 和工程 C 都依赖 log4j,但是版本号却不 一样。此时对于工程 A 来说自动导入 log4j 时根据先声明者(B)优先。
5、继承和聚合统一管理版本号
在 Maven 工程,如果使用到 spring 框架的许多模块,比如:spring-core、spring-context、spring-webmvc、 spring-beans,这些依赖肯定是要求版本号要统一的,那么在 pom 文件中就可以将这些版本号进行统一管理,而不需要每个单独管理。这样在升级 spring 框架的版本号时,也会变的非常简单,不易出错。
pom 文件中使用标签内部来声明自定义标签信息,在 pom 文件的其它地方可以使用${自定义标 签名}的方式来进行引入。
5.1.5.RELEASEorg.springframeworkspring-core${spring.version}org.springframeworkspring-beans${spring.version}org.springframeworkspring-context${spring.version}
创建聚合工程
在没有使用 Maven 工具创建 Java 工程进行软件开发时,首先根据项目工程拆分成各个模块,然后对每个模块 再使用三层架构进行开发,即 dao 层、service 层、controller 层,架构设计完毕后,就开始进行代码的编写、测试、 打包、发布等,实际上这种开发模式是存在问题的。可能dao层的两个操作都需要相同的一部分代码块,
对于大部分电商平台来说,分为买家使用的部分跟卖家使用的部分,这实际上是两个独立的工程。但是这两个工程中都涉及到查看订单的操作。对于这个可重复使用的订单业务模块,难道要在两个独立的工程中都编写一份吗?还 是说在其中一个工程中编写一份,在另一个工程中粘贴复制过去使用?如果订单模块一旦出现 bug,意味着两个工程都要进行修复。利用maven的拆分和聚合的思想就可以解决这个问题。
mavne的拆分思想即将一个完整的项目,拆分成不同的独立模块,这 些模块都有各自独立的坐标。哪个工程需要其中的某个模块,直接引用该模块的坐标即可,。把一个工程拆分成各个子模块工程后,然后再把拆分零散的模块聚合到一起组成一个完成的项目,这就是 maven 聚合的思想。
以spring项目为例,创建一个聚合工程。
在创建好一个maven项目后,我们在该工程的pom文件的校验中加入:
pom
将该工程定义为一个聚合工程,并在该工程下删除src文件夹,自己创建所需要的模块
像是一些所有模块都用得到的比如说spring-context和junit包就可以放到父工程的pom文件中。