约定优先于配置,配置优先于编码
Maven仓库:https://mvnrepository.com/
为什么需要Maven?未学习Maven前可能会遇到的问题:
①项目中需要用到的jar包需要手动一个个复制粘贴到lib目录下,导致重复jar包过多,项目臃肿;
②手动下载的jar包来源不同,内容可能不规范;
③一个jar包所依赖的其他jar包也需要手动导入,过程十分复杂繁琐,增加了学习成本。
Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具——百度百科
Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。
核心功能是合理叙述项目间的依赖关系。通俗点讲,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包。
每个Maven项目都包含一个pom.xml文件,文件中记录了若干字段,这些字段在创建Maven项目时填写,Maven会依据它们来定位到该项目。
以下是各字段的个人理解:
<?xml version="1.0" encoding="UTF-8"?>
<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.xml填写练习-->
<!--父项目坐标-->
<parent>
<groupId>cn.yrwan.parent</groupId>
<artifactId>demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<!--当前文件到父工程pom文件的相对路径-->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
<!--声明项目遵循哪一个POM模型版本-->
<modelVersion>4.0.0</modelVersion>
<!--全球唯一标识符,用以定位,域.组织-->
<groupId>cn.yrwan</groupId>
<!--构件的标识符,用以定位-->
<artifactId>demo</artifactId>
<!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号-->
<version>1.0.0-SNAPSHOT</version>
<!--项目名称, Maven产生的文档用-->
<name>demo-maven</name>
<!--打包类型 pom、jar、war-->
<packaging>jar</packaging>
<!--子项目管理,聚合-->
<modules>
<!--子项目相对路径-->
<module>moduleA</module>
<module>moduleB</module>
<module>moduleC</module>
</modules>
<!--属性声明-->
<properties>
<!--自定义标签,可方便版本的统一,或一次性修改重复参数-->
<junit.version>4.12</junit.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--将父工程的dependencies标签,放在dependencyManagement中,只起到声明依赖的作用,并不实现引入
用来管理依赖jar版本号,一般出现在项目最顶层公共的pom.xml文件中,子模块若想使用此处声明的jar包,
只需要在其dependency中添加groupId和artifactId即可,无需填写version,可以保持jar包版本号统一。
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>%{junit.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--项目引入插件所需要的额外依赖-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--依赖的范围,compile为全部,test为测试程序,provided为非部署-->
<scope>test</scope>
<!--依赖排除,可用来排除不稳定或冲突的依赖-->
<exclusions>
<exclusion>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--编译工具和插件-->
<build></build>
</project>
Maven仓库分为本地仓库和远程仓库,其中远程仓库又分为私服,中央仓库,镜像库。
这里提供一个阿里的镜像库,访问速度很快,配置在settings.xml中:
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
依赖调节原则:
1、第一原则:路径近者优先原则
A-->B-->C-->D-->X(1.6)
E-->D-->X(2.0)
使用X(2.0),因为其路径更近
2、第二原则:第一声明者优先原则。就是如果路径相同,Maven 默认配置在前面的优先使用
A-->B --> X(1.6)
C-->D--> X(2.0)
这样就是路径相同,那么如果A在前面,C在后面,则使用X(1.6)
Maven会先根据第一原则进行选择,第一原则不成,则按第二原则处理。
依赖排除:<exclusions>
<!--依赖冲突的问题测试,第一原则为路径近者优先,第二原则为第一声明优先-->
<dependency>
<!--依赖的spring-core版本为5.1.4.RELEASE-->
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.4.RELEASE</version>
<!--通过依赖排除可以人为排除指定依赖包-->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<!--依赖的spring-core版本为4.3.20.RELEASE-->
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.5.20</version>
</dependency>