文章目录
一、POM配置详解
当我们程序在需要第三方依赖的时候,我们就不用再自己手动导jar包了,我们只需要把这个第三方的依赖信息写到我们的配置文件中,即 pom.xml
,我们只需要在里面声明对应的标签,写上对应的依赖信息,最后由Maven帮助我们自动导它指定的远程仓库或者本地仓库中去下载相关的依赖到我们项目即可。
Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。
我们通过定义 POM 文件,Maven 能够自动解析项目的依赖关系,并通过 Maven 仓库
自动下载和管理依赖,从而避免了手动下载和管理依赖的繁琐工作和可能引发的版本冲突问题。
POM (Project Object Model) :指的是项目对象模型,用来描述当前的maven项目。
重点:编写pom.xml文件!
maven项目信息属性配置和读取:
<?xml version="1.0" encoding="UTF-8"?>
<!-- <project>:pom文件的根标签,表示当前maven项目 -->
<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">
<!-- 声明项目描述遵循哪一个POM模型版本,虽然模型本身的版本很少改变,但它仍然是必不可少的。目前POM模型版本是4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!-- 当前项目坐标 -->
<!-- gavp属性 -->
<!-- 由gav组成一个坐标,定位项目在本地仓库中的位置,前两个一旦声明,后面就不会改变 -->
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 -->
<!-- 当我们进行部署的时候需要修改,修改原则还是我们之前的三点,三层架构 -->
<version>1.0.0</version>
<!--
Maven工程的打包方式
默认:jar
jar指的是普通的java项目打包方式! 项目打成jar包!
war指的是web项目打包方式!项目打成war包!
pom不会将项目打包!这个项目作为父工程,被其他工程聚合或者继承!后面会讲解两个概念
-->
<packaging>war</packaging>
<!-- properties这里可以声明版本号供我们后面去使用 -->
<properties>
<maven.compile.source>17</maven.compile.source>
<maven.compile.target>17</maven.compile.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
pom文件详解:
-
<modelVersion>
: -
坐标 :
<groupId>
、<artifactId>
、<version>
-
<packaging>
:maven项目的打包方式,通常设置为jar或war(默认值:jar)
二、依赖管理配置
依赖:指当前项目运行所需要的jar包。一个项目中可以引入多个依赖:
例如:在当前工程中,我们需要用到log4j来记录日志,此时就可以在maven工程的pom.xml文件中,引入log4j的依赖。具体步骤如下:
-
在pom.xml中编写
<dependencies>
标签 -
在
<dependencies>
标签中使用<dependency>
引入坐标 -
定义坐标的
groupId、artifactId、version
在XML中任何信息都是以标签的形式,而且这个XML文件有schema约束,因此这里面都会有特定的标签去写依赖信息,所以我们只要记标签就行了。
最后它会自动下载依赖,并且还会下载依赖所需要的依赖,直到没有或者依赖冲突停止。
<!--
通过编写依赖jar包的gav必要属性,引入第三方依赖!
dependencies:项目依赖信息的集合
dependency:每个依赖项
gav:依赖的信息,其实就是其他的Maven工程,只不过是打成了jar包的Maven工程而已,这三个属性是必须的。
scope属性是可选的,可以指定依赖生效范围!
依赖信息查询方式:
1. maven仓库信息官网 https://mvnrepository.com/
2. maven-search插件搜索
-->
<dependencies>
<!-- 引入具体的依赖包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<scope>runtime</scope>
</dependency>
</dependencies>
然后点击刷新按钮,引入最新加入的坐标
刷新依赖:保证每一次引入新的依赖,或者修改现有的依赖配置,都可以加入最新的坐标
注意事项:
- 第一次使用这个依赖是没有提示的
- 如果引入的依赖,在本地仓库中不存在,将会连接远程仓库 / 中央仓库,然后下载依赖(这个过程会比较耗时,耐心等待)
- 如果不知道依赖的坐标信息,可以到mvn的中央仓库(https://mvnrepository.com/)中搜索
三、依赖版本提取和维护
在后期的时候我们会引入很多很多的依赖,如果版本号都是散列着,这会导致依赖难找并且版本号也不方便管理。
在Java中如果有一个变量在当前的类中使用了多次,你可以把这个变量声明成全局变量;同样在这,我们可以把版本号声明到 properties标签
中,这个标签内部是可以自定义标签的。
<!--声明版本-->
<properties>
<!--命名随便,内部制定版本号即可!-->
<!-- 这样写相当于声明了一个变量,好处就是在其他的位置可以通过 ${} 引用 -->
<!-- PS:声明的标签建议两层以上命令,防止跟Maven系统自带的一些变量冲突,推荐:技术名.version -->
<junit.version>4.11</junit.version>
<!-- 也可以通过 maven规定的固定的key,配置maven的参数!如下配置编码格式!-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--引用properties声明版本 -->
<version>${junit.version}</version>
</dependency>
</dependencies>
四、依赖范围
在项目中导入依赖的jar包后,默认情况下,可以在任何地方使用。
如果希望限制依赖的使用范围,可以通过 <scope>
标签设置其作用范围。
作用范围:
-
主程序范围有效(main文件夹范围内)
-
测试程序范围有效(test文件夹范围内)
-
是否参与打包运行(package指令范围内)
如上图所示,给junit依赖通过scope标签指定依赖的作用范围。 那么这个依赖就只能作用在测试环境,其他环境下不能使用。
scope标签的取值范围:
scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc驱动 |
test | - | Y | - | junit |
例如 junit
如果不加 <scope>
,那么在java代码里也是可以使用 @Test
的,但是我们一般情况下并不会在这里使用,因此为了更精确的使用这个jar包,需要设置范围为test。
解释一下Servlet为什么设置为provided:在开发过程中需要用到的 "服务器上的jar包"
通常以 provided
范围依赖进来。比如 servlet-api、jsp-api
。而这个范围的 jar 包之所以不参与部署、不放进 war 包,就是避免和服务器上已有的同类 jar 包产生冲突,同时减轻服务器的负担。说白了就是:服务器上已经有了,你就别带啦!
因此我们通过这种方式导入进来的依赖,我们只是在编码的时候有这个依赖,真正进行项目构建和打包的时候,它是不携带Tomcat所导进来的jar包的。
除了上面几个特殊的,大部分使用的还是compile。
测试log4j是否参与项目打包,需要注意:maven中默认提供的打包插件,只能将当前项目的资源打包进去,它所依赖的jar包并不会打包进去
如果需要将依赖的jar包也打包进去,则需要配置打包插件,后面学习web开发的时候有更便捷的方式!
总结:他是一种锦上添花的手段,如果你掌握不好,你就使用默认值compile,全部生效,这样一定不会错!!!
五、添加依赖的几种方式
1)利用中央仓库搜索的依赖坐标
maven仓库信息官网:https://mvnrepository.com/
一般会参考Usages(使用率)这个指标去选定版本
2)maven-search插件搜索
通过maven-search插件搜索,这个插件可以提供我们国内镜像的搜索信息。
首先安装 maven-search插件
‘
Tools ——> Maven Search
最后直接输入想要的依赖,然后复制即可。
3)利用IDEA工具搜索依赖
快捷键 alt + Insert,即构造方法的快捷键,点击 Dependency
。
心得:感觉很慢,没有 maven-search插件
好用!
然后搜索想要的依赖,选择想要的版本双击即可
4)熟练上手maven后,快速导入依赖
六、排除依赖
问题:之前我们讲了依赖具有传递性。那么A依赖B,B依赖C,如果A不想将C依赖进来,是否可以做到?
答案:在maven项目中,我们可以通过排除依赖来实现。
什么是排除依赖?
- 排除依赖:指主动断开依赖的资源。(被排除的资源无需指定版本)
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven-projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依赖, 主动断开依赖的资源-->
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖排除示例:
- maven-projectA依赖了maven-projectB,maven-projectB依赖了Junit。基于依赖的传递性,所以maven-projectA也依赖了Junit
- 使用排除依赖后