1、概述
-
Maven 官网:
https://maven.apache.org
-
Maven 是一个跨平台的项目管理工具。作为 Apache 组织的一个颇为成功的开源项目,其主要服务于基于 Java 平台的项目创建,依赖管理和项目信息管理。Maven 自身是纯 Java 开发的。
-
Maven 的主要作用:
依赖管理:依赖指的就是是项目中需要使用的第三方 JAR 包。一个大一点的工程往往需要几十上百个 JAR 包,按照传统的方式,每使用一种 JAR,就需要导入到工程中,还要解决各种 JAR 包冲突的问题。Maven 可以对 JAR 包进行统一的管理,包括快速引入 JAR 包,以及对使用的 JAR 包进行统一的版本控制。
项目结构标准化:Maven 提供了一个标准化的 Java 项目结构,可以通过 Maven 快速创建一个标准的 Java 项目。
2、Maven 安装与配置
3、Maven 仓库
-
“仓库”,简单说就是用来存放各种“依赖”(JAR 包)的地方。
-
Maven 仓库可以分为远程仓库、本地仓库。
-
Maven 工程在导入相关依赖的时候,Maven 会先到本地仓库中“寻找”,本地仓库中有的,便直接在当前 Maven 工程中使用;本地仓库中没有的,先从远程仓库中下载至本地仓库,然后使用。
本地仓库的路径可以根据实际在配置文件中进行配置。 -
远程仓库是指将依赖发布在网络上(可以是公共网络、也可以是内网),提供外界或内部使用。Maven 官方设立“中央仓库”并进行维护,“中央仓库”拥有最全的依赖(
https://repo.maven.apache.org/maven2
);一些团体通过建立对“中央仓库”镜像,形成可供特定人群便捷使用的远程仓库。
远程仓库可以根据实际在配置文件中进行配置。
4、Maven 工程涉及的概念
-
Maven 工程(项目):多数情况指使用 Maven 创建的 Java 项目,具有较为统一、规范的结构(目录、配置文件等),后续的编译等操作自然也由 Maven 完成。
-
依赖:工程所使用的第三方库称为“依赖”,查询依赖的网站:
https://mvnrepository.com
-
仓库:见上面的部分。
-
archetype(原型):Maven 预先提供的一些工程模板,便于快速创建工程。
-
GAV:G 指的是 GroupId,A 指的是 ArtifactId,V 指的是 Version,三者联合构成了 Maven 工程的唯一标识。Maven 工程中引入第三方依赖也是通过 GAV 的方式,所以也称 GAV 坐标。GroupId 一般是企业、团队的域名“倒写”,比如
com.alibaba
等;ArtifactId 可以理解是 Maven 工程的工程名,比如fastjson
;Version 是版本号。
4、Maven 工程的结构
-
Maven 工程结构官方介绍:
https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
-
常见的 Maven 工程结构(Java Web 工程):
|---pom.xml
|---+src
|---------+main
|---------------+java
|---------------+resources
|---------------+webapp
|---------------------+WEB-INF
|-----------------------------web.xml
|---------+test
|---------------+java
|---+target
上述带“+”的表示“目录”,不带“+”的表示“文件”。
上述的结构以及名称一般不能随意更改。
webapp
目录是使用 Maven 构建 Web 类型的工程时特有的。
pom.xml
:是 Maven 工程的核心配置文件,每一个 Maven 工程有一个pom.xml
文件。
src
:源码
src/main/java
:存放 Java 源码的目录
src/main/resources
:存放配置文件的目录
src/main/webapp
:存放 Web 资源的目录
src/test
:存放测试代码的目录
target
:项目构建(编译)后形成的目录
- Maven 工程中,虽然划分出多个目录,但是这种“划分”是为了便于开发,工程(项目)经过构建(编译)后,所产生的目录与开发阶段是不同的。所以在编写代码的过程中,涉及到“文件的位置”的话,多数情况下应该按照“构建后“文件位置”。
最为经典的:src/main/java
与src/main/resources
,虽然开发时候是两个各自独立的目录,但是构建后,Maven 会自动将其“合并”至一个目录(“合并”意味着:如果src/main/java
和src/main/resources
下面的子目录也一样,比如src/main/java/com/mycompany/app/App.java
和src/main/java/com/mycompany/app/mapper.xml
,构建后,App.class
与mapper.xml
会处在同一个目录中)。
类路径:类的源文件
.java
经过编译后形成的.class
文件所在的路径。
4、使用 IDEA 创建 Maven 工程
- IDEA 创建 Maven 工程之前,最好先全局性的配置 Maven。所谓“全局性”,就是通过 IDEA 关闭所有工程那个界面配置:


- 可以使用 IDEA 直接创建 Maven Project:


5、Maven 工程中核心配置文件 — pom.xml
-
每一个 Maven 工程都有一个
pom.xml
,作为核心配置文件。pom.xml
主要的涵盖的配置内容有:工程的 GAV、工程构建后的形式、对工程所使用的依赖管理、使用的插件管理等。 -
pom.xml
中pom
的含义:Project Object Model
5.1、配置文件常用整体结构
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>······</groupId>
<artifactId>······</artifactId>
<version>······</version>
<packaging>······</packaging>
<properties>
······
</properties>
<dependencyManagement>
<dependencies>
<dependency>······</dependency>
<dependency>······</dependency>
······
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>······</dependency>
<dependency>······</dependency>
······
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
······
</plugin>
<plugin>
······
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
······
</plugin>
<plugin>
······
</plugin>
</plugins>
······
</build>
</project>
5.2、GAV
- 配置文件中配置 Maven 工程的 GAV 坐标的是:
<groupId>······</groupId>
<artifactId>······</artifactId>
<version>······</version>
- GAV 一般是在创建工程的时候就已经确定的了,所以
pom.xml
中的一般不需要修改。
5.3、构建后形式
- 一个 Maven 工程同样需要经过编译之后才能够使用、发布,因为 Maven 提供了“一条龙服务”,所以编译等操作自然也是由 Maven 完成。因为不同的工程最终应用场景是不同的,也就是编译后的“产物”也是不同的。在配置文件中,可以配置编译后的“产物”:
<packaging>war</packaging>
<packaging>jar</packaging>
<packaging>pom</packaging>
-
严格意义上说,一个 Maven 工程编译后默认会形成一个
target
目录,而<packaging>
标签配置的是“打包”的“产物”。这个“产物”是可以直接部署的。 -
比较常见的“产物”是
war
、jar
、pom
。war
是可以直接部署到 Java Web 服务器软件上的;打包成jar
的话,就可以生产第三方库;pom
更多使用在 Maven 工程聚合中。
5.4、依赖管理
-
依赖管理可以说是 Maven 的最大用处之一。
-
pom.xml
中与依赖管理有关的标签主要有:
<dependencies>
<dependency>······</dependency>
<dependency>······</dependency>
······
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>······</dependency>
<dependency>······</dependency>
······
</dependencies>
</dependencyManagement>
- 导入依赖:导入依赖使用的是
<dependencies>
标签,在这个标签下,再使用<dependency>
标签,一个<dependency>
标签表示一个依赖:
<!-- 一个“依赖”单元,使用 <dependency> 标签,其中包裹依赖的 GAV -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<!-- 导入“依赖”,在 <dependencies> 标签中包裹“依赖”单元 -->
<dependencies>
······
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
······
<dependencies>
- “依赖”单元
<dependency>
中的常用标签:
<groupId>
:GroupId,GAV 中的 G,必要标签
<artifactId>
:ArtifactId,GAV 中的 A,必要标签
<version>
:version,版本,GAV 中的 V,必要标签
<scope>
:该依赖作用域,可选标签,常见的有provided
、test
、compile
等。
compile
:默认作用域(当没有<scope>
标签时)。compile
表示依赖需要参与当前项目的编译,当然后续的测试,运行周期也参与其中。打包的时候通常需要包含进去。
provided
:意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile
,但是在打包阶段做了exclude
(排除)的动作。
test
:表示依赖仅仅参与测试相关的工作,打包阶段也是exclude
(排除),典型的如 Junit。
-
<dependencyManagement>
可以实现对依赖的“版本控制”。
<!-- 在 <dependencyManagement> 中声明依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<!-- 统一声明版本等信息 -->
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 正式导入依赖 -->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<!-- 只需 GA,无需再写其他的,因为上面已经对依赖进行了完整的声明 -->
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
</dependency>
</dependencies>
在<dependencyManagement>
标签中包括<dependencies>
标签,但是在<dependencyManagement>
标签中不代表导入依赖,真正导入依赖需要在与<dependencyManagement>
标签同级的<dependencies>
标签下。
在<dependencyManagement>
标签中是对依赖进行声明,这个声明中所使用的依赖单元(<dependency>
)是完整的,GAV 和其他的一些标签该写的都写上。声明之后,在正式导入依赖的时候,依赖单元中,只需写 GA 即可。
5.5、插件管理
5.6、其他
6、Maven 常用命令
7、其他
- 与 Maven 类似项目管理工具的,还有 Gradle(
https://gradle.org
);
在当前的前端领域,也有类似于 Maven、Gradle 的 npm 等,前端的开发模式也与后端越来越像。
网友评论