文章目录
Maven简介
Maven与Ant的区别
Ant: 一个项目通过不同的package区分不同模块,整个项目打包(jar,war)发布,其他项目引用时需要导入,每次修改之后需要重新打包,重新导入。
Maven: 把Ant中的一个项目中的不同的包拆分成单独的项目,通过仓库来相互引用,每次修改一个package时,不需要重新打包,自动就更新了
仓库
Maven项目的分布式是通过仓库来实现的,项目添加的某个依赖之后,会先检索本地仓库,如果本地仓库没有的话,就会检索中央仓库,中央仓库中有则下载到本地仓库
本地仓库: 计算机中的文件夹,在/maven/conf/setting.xml文件中可自己定义
<localRepository>D:\Maven\maven-repository</localRepository>
中央仓库: Maven管理的一个默认仓库,不需要配置,需要联网才能访问: https://repo1.maven.org/maven2/
由于是国外网站,访问较慢,可以通过配置国内镜像提高下载速度,在/maven/conf/setting.xml文件中定义镜像
<!-- 阿里云镜像-->
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
坐标
前面在Maven与Ant的区别中讲到,在Maven项目中通过仓库来互相引用项目,如何在仓库中找到要引用的项目呢? 就需要了解坐标这个概念,坐标由下面三个部分组成:
groupId: 通常是公司名.公司网址倒写,同package命名规则
artifactId: 项目名
version: 版本号
POM(Project Object Model)
如果你认真的看完了前面讲的东西,那我们想在需要发挥一下想象,每个Maven项目(project)都是在仓库中的一个对象(object),每个项目对象(project object)都有一个坐标,通过坐标,可以在仓库中引用不同项目(project)的内容,整个的这个模型(model)就是POM。
POM的具体表现就是Maven项目中的pom.xml文件,通过pom.xml构建项目与项目之间的关系
创建自己Maven项目
当你创建一个新的Maven项目时,在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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hand</groupId>
<artifactId>hssp-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>
此处定义了自己的Maven项目的坐标
项目关系
前面解释POM的时候,我们把项目想象成仓库中的一个个的对象,对象和对象之间的关系简单的可以分为以下几种。
依赖
引用其他项目的内容,只需要在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>4.0.0</modelVersion>
<groupId>com.hand</groupId>
<artifactId>hssp-parent</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.hand</groupId>
<artifactId>hap-db</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
在项目开发时,如果是想引用你自己开发的本地项目,添加本地项目坐标,如果想引用开源的项目,则添加开源项目在中央仓库中的坐标即可。
不知道想引用的开源项目的坐标怎么办?
给大家提供一个查询网站:http://mvnrepository.com/
继承
在前面说Ant和Maven的区别的时候,我们把Ant中的Package对应到了Maven中的project。那么在Ant中的一个完整的项目由多个Package组成,而在Maven中一个完整的项目,则是由多个project组成的。
在构建项目模型的时候,我们会先创建一个父project,然后创建多个子project。
需要注意的是,这个地方有以下几个规范:
1,父项目必须是pom类型
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hand</groupId>
<artifactId>hssp-parent</artifactId>
<packaging>pom</packaging><!--项目类型-->
<version>0.0.1-SNAPSHOT</version>
</project>
2,子项目如果还有子项目,则子项目也必须是pom类型
3,子项目中通过<parent>
标签指定父项目
<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/maven-v4_0_0.xsd">
<parent>
<artifactId>hssp-parent</artifactId>
<groupId>com.hand</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hap-core</artifactId>
<packaging>war</packaging>
<name>hap-core</name>
<url>http://maven.apache.org</url>
</project>
通过这种方式子项目继承了父项目,父项目中添加的依赖,子项目无需重复添加。
聚合
继承关系已经解决了大部分的项目关系之间的工作,但是有一个小问题是,从父项目的pom.xml中并不能看到有哪些子项目,如果想了解到父子项目之间这种更强的继承关系,可以使用聚合来构建项目关系。
此时父项目的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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hand</groupId>
<artifactId>hssp-parent</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<!--子项目-->
<modules>
<module>hap-db</module>
</modules>
</project>
项目关系管理
dependencyManagement标签
通过项目之间的继承或者聚合关系构建项目时,我们讲到子项目可以直接引用父项目的依赖,如果我们想对依赖做更精细的控制,则需要用到<dependencyManagement>
标签。
在父项目的pom.xml中定义整个项目所有的依赖:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.hand</groupId>
<artifactId>hap-db</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
子项目此时不会直接引用父项目的依赖,需要在子项目中的pom.xml中引用依赖:
<dependencies>
<dependency>
<groupId>com.hand</groupId>
<artifactId>hap-core-db</artifactId>
<scope>provided</scope><!--依赖范围-->
</dependency>
</dependencies>
此时子项目中的依赖不需要version标签,统一通过父项目来控制版本。
通过
<dependencyManagement>
统一控制项目依赖版本,精细的控制子项目需要用到的依赖,而不是每个子项目都加载所有父项目依赖
properties标签
而在父项目中为了统一管理依赖的版本,可以使用此标签自定义,在<dependency>
中引用:
<properties>
<spring.version>4.3.14.RELEASE</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>