其实学会Maven很容易,带你快速了解Maven教程
Posted jiangxiaoju
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了其实学会Maven很容易,带你快速了解Maven教程相关的知识,希望对你有一定的参考价值。
在开始之前,请先确保你的电脑已经安装了jdk1.7或者以上版本,maven,以及IDEA或者eclipse
推荐教程:
文章目录
简介
Maven是什么?
Maven官网:https://maven.apache.org/
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
Maven能做什么?
依赖管理
在没学习maven之前,如果你学过spring框架或者其他框架的时候,是不是通常得手动复制一大堆jar包到项目中。随着我们项目的不断扩大,模块越来越多,引入的jar也随之增多。这时候管理这些依赖就是一件很让人头疼的时,不同的jar包之间可能存在冲突或者版本之间不匹配等各种各样的问题。
而使用maven的话,我们可以事先将各种jar包放到一个仓库中,当项目中需要中使用的时候,只要通过pom.xml
中的做表,到我们事先存放jar包的仓库中找到这些jar包,再用这些jar包去运行即可。
我们也可以通过pom.xml
中的坐标去管理各个依赖之间的关系(这个后面会详细提到)。
项目构建
一个项目中,往往都要经历编译、测试、运行、打包、安装 ,部署等一系列过程。
maven可以帮我们管理这一系列过程。通过maven提供的命令就可以轻松搞定。
为什么要学Maven
-
提高开发效率。
-
现在开源的项目或者很多教程,都会使用到maven,不学的话,很难看懂别人的代码。
Maven工程
Maven工程的目录结构
首先我们先使用idea创建一个maven工程(不知道怎么创建的话可以参考这里Maven环境配置以及IDEA使用maven创建项目)。
创建好后,会得到这么个一个目录
-
pom.xml:maven 项目核心配置文件。
-
src/main目录下就是存放跟我们项目相关的文件
- src/main/java:存放项目
*.java
文件。 - src/main/resources:存放项目的资源文件,例如spring、myabtis等配置文件。
- src/test/java:存放测试用的
*.java
文件。 - src/test/resources:测试资源文件
- src/main/java:存放项目
-
target:项目输出位置,编译好的
.class
文件会输出到这里 -
如果是一个javaweb项目,在src/main目录下还会有一个webapp目录,用于放置网页文件等
Maven概念模型——POM(Project Object Model)
创建好maven工程后,打开pom文件,一般会出现以下内容。(idea上不同方式创建,多少会有些不同)
Maven 包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
-
项目对象模型
一个 maven 工程都有一个 pom.xml 文件,通过 pom.xml 文件定义项目的坐标、项目依赖、项目信息、
插件目标等;例如定义自己项目中的一些信息。
- groupId:项目名称
- artifactId:模块名称
- version:版本信息
<groupId>org.example</groupId> <artifactId>test</artifactId> <version>1.0-SNAPSHOT</version>
-
依赖管理系统
通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理。
比如:项目依赖 junit4.9,通过在 pom.xml 中定义 junit4.9 的依赖即使用 junit4.9,如下所示是 junit4.9
的依赖定义:
<dependencies> <!-- 此项目运行使用 junit,所以此项目依赖 junit --> <dependency> <!-- junit 的项目名称 --> <groupId>junit</groupId> <!-- junit 的模块名称 --> <artifactId>junit</artifactId> <!-- junit 版本 --> <version>4.13</version> <!-- 依赖范围:单元测试时使用 junit --> <scope>test</scope> </dependency> </dependencies>
-
一个项目生命周期(Project Lifecycle)
使用 maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven 将这些过程规范为一个生命周期。
-
插件(plugin)目标(goal)
maven 管理项目生命周期过程都是基于插件完成的。
POM文件中各个标签的详细介绍
这里记录下常用的标签用法,若有缺漏,欢迎评论区留言,我看到了会及时补上。
可以先看之后的内容,再回过头来看这部分。
modelVersion
描述这个pom文件遵循哪个版本的项目描述符
<modelVersion>4.0.0</modelVersion>
parent
父级依赖,继承哪个pom项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
groupId、artifactId、version
- groupId:项目名称
- artifactId:模块名称
- version:版本信息
<groupId>org.example</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
packaging
定义项目的打包方法。可选值有:pom、jar、war、maven-plugin
<packaging>jar</packaging>
properties
在properties可以自定义一些属性值
<properties>
<junit.version>4.13</junit.version>
</properties>
使用的方法如下
<properties>
<junit.version>4.13</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>$junit.version</version>
<scope>test</scope>
</dependency>
</dependencies>
dependencies、dependence
- dependencies:里面包含多个dependence
如果要查询某些依赖作标,可以到这个网站上http://www.mvnrepository.com/
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
exclusions、exclusion
当某个依赖重复导入时,可以用exclusions排除项目中的某个依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
scope
依赖范围有四种
- compile
- test
- runtime
- provided
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
dependencyManagement
在父工程中使用。如果在子工程中没有定义依赖版本,就默认使用父工程这里定义的。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
Maven仓库
maven项目运行的时候会通过pom.xml文件中的依赖作标引入一些依赖jar包,首先会现到本地区寻找,如果有的话,则直接引入,若没有的话,则从远程仓库下载(联网下载),然后保存到本地,之后再使用的话,直接引用本地的就行。
maven仓库分为三类:
- 本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找。默认本地仓库的位置为
$user.dir/.m2/repository
,$user.dir
也就是window用户目录。这个可以通过修改maven/conf下的settings.xml文件来设置。 - 远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。
- 中央仓库 :在 maven 软件中内置一个远程仓库地址 http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件。
Maven常用命令
compile
compile是maven工程的编译命令。可以把src/main/java中的java文件编译成class文件输出到targe目录下。使用方法如下图
test
test是maven工程的测试命令,会执行src/test/java下的单元测试类。
使用方法如下。
clean
clean是maven工程的清除命令,执行后会删除targe目录
package
package是maven工程的打包命令,根据\\<packaging\\>
的内容打包成jar包或者war包。
mvn package
install
install 是 maven 工程的安装命令,执行 install 将 maven 打成 jar 包或 war 包发布到本地仓库。
mvn install
Maven指令的生命周期
maven 对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,
这三套生命周期分别是:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle 生成项目报告,站点,发布站点。
maven指令有以下这些,当执行某个指令后,会把它之前的指令也执行一次。例如执行test指令的话,也会执行clean、compile。
Maven项目的依赖
什么是传递依赖
现在项目中加入父标签
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
然后加入spring-boot-starter-web坐标
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
然后使用idea的工具来查看下项目的依赖结构
会发现除了引入的spring-boot-starter-web
之外,还有其他jar包存在。因为我们项目依赖了spring-boot-starter-web
,而spring-boot-starter-web
也以来了tomcat
、spring-webmvc
等。所以它们也出现在了我们项目中。这就是传递依赖。
依赖冲突
依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突。
依赖冲突的解决
因为依赖传递等原因把某一个jar包的不同版本都引入到了项目中。我们可以选择保留某一版本的依赖。使用<exclusions>把依赖排除掉
到此,本文就此结束。希望能帮助你快速了解并使用maven。
拒绝白嫖,从点一键三连做起。
以上是关于其实学会Maven很容易,带你快速了解Maven教程的主要内容,如果未能解决你的问题,请参考以下文章
快速学习Maven项目构建绽放本真的天赋两场Chat | 新知 · 预报