一、maven介绍
Maven是一款自动化构建工具,专注服务于JAVA平台的项目构建和依赖管理。在javaEE开发的历史上构建工具的发展也经历了一系列的演化和变迁。
管理jar包
当我们使用SSM之后我们就需要使用非常多的jar包
没有maven找jar包非常的麻烦。
使用maven下载,快捷,方便,便捷。
jar包之间复杂的依赖关系maven也可以非常方便的处理。
jar包之间复杂的引用关系,不可能通过人工来管理,因为其非常的复杂。
Maven作为构建管理工具
之前的构建是idea帮我们完成的也就是,在部署javaweb时的工件,war包是idea自动替我们生成出来了,idea帮我们做了打包和部署的工作。运行后出来的out目录就是编译后得到的文件。
在Tomact中真正运行的是out目录中的文件,也就是编译后的out目录。
1.maven是用来管理规模庞大的jar包。
2.maven可以让web程序脱离IDE环境执行,也就是发布给用户使用。
1.2:构建环节
构建不等于创建,构建就是使用原材料来生产产品。就是用你写的代码组成一个最终的产品。也就是在服务器上运行的项目,能提供给用户使用。
(1)清理:删除以前的编译结果,为重新编译做好准备。
(2)编译:将java源码程序编译为字节码文件。
(3)测试:运行单元测试用例程序,确报项目在开发过程中关键点的正确性。
(4)报告:测试程序的结果。
(5)打包:将java项目打成jar包;将web项目打成war包。
(6)安装:将jar包或war包安装到本地仓库
(7)部署:将jar包或war从Maven仓库中部署到Web服务器上运行。
对结构进行了统一:
把一个项目运用对象的管理的方式去管理。
1.3:依赖
如果工程A里面用到了B工程的接口、类、配置文件等等这样的资源,那么我们是A依赖于B
对A来说没有B,A就不能正常工作。
1.4:Maven的工作机制
二、Maven下载与安装配置
2.1:Maven下载:
官网:
Maven – Welcome to Apache Maven
下载地址:
http://maven.apache.org/download.cgi
2.2:配置MAVEN—HOME
三、Maven的仓库和坐标
3.1:仓库:用于存储资源,包含各种jar包。
中央仓库都是开源的。
私服不是开源的。
3.2:坐标:用于查找需要的资源
Maven中的坐标用于描述仓库中资源的位置
Central Repository:
https://mvnrepository.com
用于查找你需要的jar包和资源。
坐标的书写方式,通过复制粘贴的方式使用。
3.3:本地仓库配置:
1.执行mvn后C:\Users\Administrator路径下会出现.m2文件夹,这个就是你的仓库
因为C盘为系统盘,为了系统的流畅我们需要修改仓库的位置
2.修改仓库位置
在maven中的conf文件夹中的setting文件中修改默认的仓库位置
这样就配置好了本地仓库的位置。
3.4:远程仓库配置:
将获取网址改为国内的阿里镜像仓库网址
将这段代码加入到setting.xml文件中的mirror标签中
3.5:全局setting和用户setting用户的区别
-
全局就是所有用户登录都会按照setting中的配置。
-
用户setting就是不同用户登录有自己个性化的setting配置。
在本地仓库中再建立一个setting文件,这样就可以实现用户的自定义个性化的setting配置。
四、第一个Maven项目(手工制作)
4.1:Maven工程目录结构
4.2:Maven的pom配置
maven工程要求再src的同级目录下创建一个pom.xml文件来管理项目
这样目录结构就做好了,接下来需要构建项目。
4.3:Maven项目构建命令
在pom所在文件夹进入cmd执行
4.3.1:maven的编译(mvn compile)
执行编译后会下载所需要的插件,执行compile所对应的插件,也是maven项目所需要的东西,我们现在就是将各种东西拼凑出一个maven项目。mvn compile命令可以用来编译,当你的文件中没有能编译的环境时,它就会下载所需要的插件,来帮助它完成编译操作。
下载完成后编译,编译完成后显示编译成功
编译完成后多出一个目录target
target中放的就是编译完成的结果
target文件夹中的classes文件夹中放的是源程序编译后字节码。
test-classes中放的是测试程序编译后生成的字节码
4.3.2:maven清理编译(mvn clean)
同样是先下载运行命令所需要的插件
然后执行命令的功能
清理完成后target文件夹将会被清空
4.3.3:maven测试(mvn test)
在target文件下的surefire-reports中的txt文件中可以看到测试的结果。
详细信息在xml文件中,xml文件中有测试所用到的各种东西的信息,比如jdk版本所用字符集等。
4.3.4:maven打包(mvn package)
maven只会打包你的源程序
打包指令会先将你的项目编译,然后执行测试程序,当测试程序没有问题之后再进行打包
打包的结果放到target文件夹下
就是这个后缀为jar的文件。
4.3.5:maven安装(mvn install)
就是把现在的项目放到本地仓库里
放在com文件夹下
在pom文件中配置的groupid为com.itheima所以放到了com文件夹下
maven安装也会执行一遍编译和测试,以便于确保打包的准确性
4.4:使用模板创建Maven工程
使用模板来创建工程
在目录中执行命令就可以快速的创建一个maven项目
4.5:pom.xml解读
pom.xml是maven工程的核心配置文件,后续所要做的所有的配置都是在pom.xml中做的。
甚至可以说我们学习maven怎么用就是在学pom.xml怎么用。
<!--project标签:根标签:project project就是工程的意思可以翻译成工程也可以翻译成项目,代表着我们这个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标签:从maven2固定是4.0.0 代表当前pom.xml所采用的标签结构-->
<modelVersion>4.0.0</ modelVersion>
<!--
groupId 标签:坐标向量之一:代表公司或组织开发的某一个项目
artifactId标签:坐标向量之一:代表项目下的某一个模块
version标签:坐标向量之一:代表当前模块的版本
就是我们的坐标信息,工程的坐标信息简称gav
-->
<groupId>com.atiguigu.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<!--packaging标签:当前maven工程打包的方式,默认方式是以jar包的方式进行打包,生成jar包说明这是一个java工程,如果取值是war那么打包说明这是一个web工程-->
<!--取值pom:说明这个这个工程是用来管理其它工程的工程-->
<packaging>jar</packaging>
<!--name是工程名-->
<name>pro01-maven-java</name>
<!--url是maven的官网-->
<url>http://maven.apache.org</url>
<!--properties标签:在Maven中定义属性值,其中包含的标签是属性名,其中的内容是属性值,可以是maven给我们提供的属性值也可以是我们自定义的属性值-->
<properties>
<!--在构建过程中读取源码时使用的字符集-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--dependencies 标签:配置具体依赖信息,就是通过dependencies来导入jar包-->
<dependencies>
<!--dependency 标签用来配置一个具体的依赖信息-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
<!--
通过坐标来指定依赖,想导入哪个jar包就配置她的坐标信息即可
scope标签用来配置当前依赖的范围。就像junit就是用来做单元测试的它的范围就是test
-->
</dependency>
</dependencies>
</project>
4.6: Maven核心概念:POM
4.6.1:含义
POM:Project Object Model,项目对象模型。和POM类似的是DOM(Document Object Model),文档对象模型,它们都是模型化思想的具体体现。
4.6.2:模型化思想
POM表示将工程抽象为一个模型,再用程序中的对象来描述这个模型,这样我们就可以用程序来管理项目了。我们在开发过程中,最基本的做法就是将生活中的事物抽象为模型,然后封装模型相关的的数据作为一个对象,这样就可以在程序中计算与现实事物相关的数据。
4.6.3:对应的配置文件
POM理念集中体现在Maven工程根目录下pom.xml这个配置文件中。所以这个pom.xml配置文件就是Maven工程的核心配置文件。其实学习Maven就是学习这个文件怎么配置,各个配置有什么用。
4.7:简单的maven程序测试
程序代码
测试代码
4.8:创建Maven版的Web工程
1.说明
使用mvn archetype:generate命令生成web工程时,需要使用一个专门的archtype.这个专门生成web工程骨架的archtype可以参照官网看它的用法:
2.操作
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -Da
运行完这个命令目录结构为
接下来需要自己创建servlet和test目录
7.编译
此时直接执行编译会报错,因为缺少HttpServlet程序包(类)不存在。
我们需要自己去导入包
HttpServlet这个类是在servlet-api这个jar包中,所以我们要导入这个包。
8.配置对servlet-api.jar包的依赖:
https://mvnrepository.com/
网站查询到相应的jar包并使用。
五、让Web工程去依赖Java工程(两个工程都是我们之前创建的,这里学习怎样依赖我们自己创建的工程)
5.1:观念
明确从来只有Web工程依赖java工程,没有java工程依赖Web工程。本质上来说,Web工程依赖的Java工程实际上就是导入Web工程中的jar包。最终java工程会变成jar包放在Web工程的WEB-INF/lib目录下。
5.2:操作
只需要在pom.xml中加入对应java工程的坐标就可以了
创建test目录将TestHelloServlet.java复制到test目录中执行mvn test这时是可以正确执行的也就是我们通过maven将我们的java工程导入到了我们的web工程这时候我们再对pro02项目进行打包,导入的java工程的jar包就会出现在WEB-INF/lib文件夹下
六、测试依赖的范围
6.1:依赖范围
标签的位置:dependencies/dependency/scope
标签的可选值:
- compile(编译范围):这是
<scope>
标签的默认选项。被标记为compile的依赖会在项目的编译、测试和运行阶段都被包含进来。在项目打包时,这些依赖会被打入最终的包里面。 - test(测试范围):被标记为test的依赖仅在测试阶段有效,它们不会被包含进最终的打包结果中。这适用于仅在测试时需要的库,比如JUnit或TestNG等测试框架。
- runtime(运行时范围):runtime范围的依赖在运行和测试阶段可用,但在编译阶段不可用。这通常用于那些在编译时期不需要,但在运行时期需要用到的依赖项。
- provided(已提供范围):provided依赖在编译和测试时有效,但在运行时预期由容器或运行环境提供。例如,当你的Web应用运行在Servlet容器中时,servlet-api就是一个provided依赖,因为容器已经提供了这个API。
- system(系统范围):system范围的依赖与provided类似,它表示依赖在编译和测试时有效,但不会在运行时由Maven自动提供,必须手动提供。这种类型的依赖很少使用,因为它破坏了Maven跨平台一致性的目标。
- import(导入范围):import范围的依赖只在dependencyManagement中使用,它不会影响到实际的项目依赖树。也就是说,这样的依赖不会被传递到项目的其他部分。
- optional(可选范围):被标记为optional的依赖意味着即使没有这个依赖,项目也能正常构建。它通常用于可选功能,如果存在,可以增加一些附加的功能,但并不是必需的。
七、Maven之间的依赖传递
7.1:compile依赖传递
只要与上一级依赖的关系是compile就可以传递给之后的依赖使用
mvn dependency:tree
mvn dependency:list
7.2:compile依赖传递中的版本冲突
如图所示,如果B和C都依赖与D但是所依赖的版本不同,那么就会出现冲突,这时我们只需要在A依赖B时做配置,那么A项目中就不再会有D0.1的版本,同时不影响B对D0.1的依赖。
八、Maven中的继承
8.1:概念
Maven工程之间,A工程继承B工程
-
B工程:父工程
-
A工程:子工程
Maven中的继承本质上就是POM.XML文件的继承
本质上是A工程中的pom.xml中的配置继承了B工程中的pom.xml的配置。
8.2:作用
在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本。
作用:将父工程作为模板,模板内容就是依赖的jar包,以这个模板开发众多项目,当模板改变时因为开发的项目是该模板的子工程,这时就可以通过修改父工程来实现一处修改,处处生效,避免了模板改动,所有子项目都需要一,一改动,避免了重复无意义的工作。
8.3:创建父工程
父工程中是不写java程序的仅仅提供pom文件即可。
不写java代码
8.4:在父工程中创建子工程
8.5:在父工程中统一管理依赖信息
在父工程中管理这些依赖,后子工程并不会直接能使用这些依赖。
想要使用依赖仍旧要引用,但是不用再写版本号,因为父类已经选好了
-
情况一:子工程省略version标签
子工程使用的依赖版本就是父工程管理的依赖版本。
-
情况二:没有省略version标签
1.和父工程管理的版本一样:多此一举
2.和父工程管理的版本不一样:子工程指定的版本覆盖了父工程管理的版本最终采纳的子工程中配的
子工程按自己的需要从父工程中拿就好,不用全部拿过来。
如果想升级依赖版本,在父工程中一处修改,处处生效
8.6:通过配置自定义属性来实现只修改一处就可以改变所有
通过引用的方式来实现动态的修改所有引用该值的依赖版本
8.7:父工程的实际意义
实践层面的意义就是可以吸取公司之前的项目经验使用合适的依赖版本,不用反复的造轮子,而是将更多的时间放到项目的功能开发。
九、聚合
9.1:配置方式
就是modules标签里面配moudle
9.2:配置聚合的意义
聚合就是部分组成整体,各个模块组成了我们整个的项目。
项目:整体
模块:部分
在总工程中执行mvn命令其中的模块也能同时执行。
总工程中会自动去按照项目之间依赖的关系来执行mvn命令。
例如在4中依赖5
在5中依赖6
那么在3中执行mvn install命令就会先安装6再安装5再安装4
这个时候不能让6依赖4,不能形成闭环,不然就会报错。
十、在IDEA中使用Maven
10.1:创建父工程并配置Maven信息
10.1.1:设置idea中的Maven仓库地址为自己的地址
同时将配置文件改成自己的
10.1.2:修改POM文件
修改pom文件为自己需要的样子。
10.2:创建子工程模块
10.2.1:创建java模块工程
新建工程模块后父工程中IDEA会帮我们添加packing标签为pom,modules标签为子工程名
10.2.2:测试java子工程模块
1.导入junit,(如果是我们不熟悉的就去网站找然后复制配置信息)
2.编写测试程序
在main的java目录下编写程序
3.在test的java目录下编写测试程序
4.运行测试程序
10.2.3:创建Web子工程模块
创建web子工程模块,选择webapp的archtype
10.2.4:编写web测试程序
1.java程序
2.index.jsp页面
3.配置本地Tomact
4..测试效果
需要注意的是maven对web工程的目录上下级有特殊的要求如果没有按照要求来,那么打包的时候会出问题,所以建议使用maven的模板来创建工程
10.3:工程导入
怎样导入别人的maven工程
找到pom.xml存在的目录idea就能够识别,将它打开。
每一个新的project需要重新配置本地仓库位置,项目中的moudle则不需要。
10.4:模块导入
10.4.1:将需要导入的模块文件夹放入项目
这个时候IDEA还没有将其检测为模块,只是看成一个普通的文件夹
10.4.2:添加为模块
让IDEA以Maven的方式来导入文件夹为模块
当添加的模块为web模块时要配置正确的web.xml路径,否则maven在打包时不能正确的识别并进行打包。