最全!最强大!Maven知识大全
yuyutoo 2025-01-19 01:30 3 浏览 0 评论
一、什么是Maven
Maven是Apache的一款开源的项目管理工具,是Apache基于ANT进行升级后,研发出了全新的自动化构建工具。
Maven使用项目对象模型(POM-Project Object Model,项目对象模型)的概念,可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。在Maven中,每个项目都相当于是一个对象,对象(项目)和对象(项目)之间是有关系的,关系包含了:依赖、继承、聚合,实现Maven项目可以更加方便的实现导jar包、拆分项目等效果,因此,大部分公司项目都采用 Maven 管理。
二、Maven下载
Maven的官网地址如下:http://maven.apache.org/
具体的下载界面如下:
2.1 设置 Maven 环境变量
添加环境变量 MAVEN_HOME
右键 "计算机",选择 "属性",之后点击 "高级系统设置",点击"环境变量",来设置环境变量,有以下系统变量需要配置:
新建系统变量 MAVEN_HOME,变量值:D:\apache-maven-3.8.6(这里是下载的Maven的地址)
编辑系统变量 Path,添加变量值:%MAVEN_HOME%\bin
三、IDEA整合Maven
如下图所示,可以用自己下载的Maven路径替换系统自带的版本。
四、Maven目录结构解析
Maven目录结构如下图所示:
bin:存放的是执行文件和命令,在IDEA中可以直接集成Maven
conf目录:存放的是配置信息,其中有一个非常重要的配置文件settings.xml,这是maven的核心配置文件,是一个全局配置文件。
在电脑C盘的用户主目录下面有一个隐藏文件夹.m2文件夹,这是Maven默认的工作文件夹。如果没有.m2目录 ,可以通过手动执行mvn命令创建。
五、Maven常见命令
常见命令 | 描述 |
install | 本地安装, 包含编译,打包,安装到本地仓库。 |
clean | 清除已编译信息。 |
compile | 只编译, javac命令 |
package | 打包命令,包含编译和打包两个功能。 |
install和package的区别:
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库。
六、Maven仓库
在 Maven 的术语中,仓库是一个位置(place)。Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
Maven 可以在某个位置统一存储所有的 Maven 项目共享的构件,这个统一的位置就是仓库,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其它项目使用。
Maven仓库是基于简单文件系统存储的,集中化管理Java API资源(构件)的一个服务。仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径。得益于 Maven 的坐标机制,任何 Maven项目使用任何一个构件的方式都是完全相同的。
Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
对于Maven来说,仓库分为两类:本地仓库和远程仓库。
6.1 本地仓库
本地仓库只是本机的一份拷贝,用来缓存远程下载的内容,包含我们尚未发布的临时构件。
运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/repository/ 的仓库目录。
Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。
6.2 远程仓库
我们称不在本机中的一切仓库都是远程仓库。远程仓库又分为中央仓库和本地私服仓库。
远程仓库指通过各种协议如file://和http://访问的其它类型的仓库。这些仓库可能是第三方搭建的真实的远程仓库,用来提供他们的构件下载(例如repo.maven.apache.org和uk.maven.org是Maven的中央仓库)。其它“远程”仓库可能是我们的公司拥有的建立在文件或HTTP服务器上的内部仓库(不是Apache的那个中央仓库,而是我们公司的私服,我们在局域网搭建的maven仓库),用来在开发团队间共享私有构件和管理发布的。
默认的远程仓库使用的Apache提供的中央仓库:
Apache的mvn远程仓库: https://mvnrepository.com/
如果仓库A可以提供仓库B存储的所有内容,那么就可以认为A是B的一个镜像。
在国内直接连接中央仓库下载依赖,由于一些特殊原因下载速度非常慢。这时,我们可以使用阿里云提供的镜像仓库来替换中央仓库。修改 maven 根目录下的 conf 文件夹中的 settings.xml 文件,在 mirrors 节点上,添加内容如下:
6.3 仓库优先级
七、JDK配置
当IDEA中有多个JDK时,需要在Maven中指定编译和运行的JDK,在settings.xml中配置:
注:配置的前提是IDEA中要有1.8的JDK
<profile>
<!-- settings.xml中的id不能随便起的 -->
<!-- 告诉maven我们用jdk1.8 -->
<id>jdk-1.8</id>
<!-- 开启JDK的使用 -->
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<!-- 配置编译器信息 -->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
八、Maven工程类型
- POM工程:POM工程是逻辑工程。用在父级工程或聚合工程中。用来做jar包的版本控制。
- JAR工程:打包成jar,用作jar包使用。即常见的本地工程 ---> Java Project。
- WAR工程:打包成war,发布在服务器上的工程。
九、IDEA创建Maven工程
项目的标准目录结构如下:
9.1 Maven项目目录介绍
- src:包含了项目所有的源代码和资源文件,以及其他项目相关的文件。
- src/main/java:这个目录下储存java源代码。
- src/main/resources:储存主要的资源文件。比如xml配置文件和properties文件。
- src/test/java:储存测试用的类,比如JUNIT的测试一般就放在这个目录下面。因为测试类本身实际是不属于项目的,所以放在任何一个包下都显得很尴尬,所以maven专门创建了一个测试包,用于存放测试的类。
- src/test/resources:可以自己创建,储存测试环境用的资源文件。
- target:编译后内容放置的文件夹 。
- pom.xml:Maven的基础配置文件。配置项目和项目之间关系,包括配置依赖关系等等。
--test 项目名
--.idea 项目的配置,自动生成的,无需关注。
--src
-- main 实际开发内容
--java 写包和java代码,此文件默认只编译.java文件
--resource 所有配置文件,最终编译把配置文件放入到classpath中。
-- test 测试时使用,自己写测试类或junit工具等
--java 储存测试用的类
pom.xml 整个maven项目所有配置内容。
十、Maven工程关系
10.1 依赖关系
A工程在开发或运行过程中需要B工程提供支持,则说明A工程依赖B工程。
在这种情况下,A项目的pom.xml文件中需要配置定义依赖关系。
10.1.1 如何注入依赖呢?
在pom.xml文件中,根元素project下的 dependencies标签中,配置依赖信息。标签中可以包含多个 dependence元素,以声明多个依赖。
每个依赖dependence标签都应该包含以下元素:groupId、artifactId, version ,这三个是依赖的基本坐标, 对于任何一个依赖来说,基本坐标是最重要的,Maven是根据坐标寻找需要的依赖的。
10.1.2 依赖的优点
- 节省了手动添加jar包的操作,省时省力!!!
- 解决jar包冲突问题。
10.1.3 依赖原则
1.第一原则:最短路径优先原则
“最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。
例如,假设A、B、C之间的依赖关系是A->B->C->D(1.0) 和A->F->D(2.0),那么D(2.0)会被使用,因为A->F->D(2.0)的路径更短。
2. 第二原则:最先声明原则
依赖路径长度一样长的时候,第一原则就不适用了,比如这样的依赖关系:A–>C–>Y(1.0),A–>D–>Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样长的,都为2。那么到底谁会被解析使用呢?
在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第二原则:最先声明优先。
在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优先使用。
10.1.4 依赖的传递性
依赖传递性是Maven2.0的新特性。
假设项目依赖于一个库,而这个库又依赖于其他库。我们不必自己去找出所有这些依赖,我们只需要加上直接依赖的库,Maven会隐式的把这些库间接依赖的库也加入到我们的项目中。
这个特性是靠解析从远程仓库中获取的依赖库的项目文件实现的。
一般的,这些项目的所有依赖都会加入到项目中,或者从父项目继承,或者通过传递性依赖。
如果B依赖了C,那么A依赖B时会自动把B和C都导入进来。
案例:
项目1:test项目依赖了Mybatis的内容,创建test项目后,选择IDEA最右侧Maven面板lifecycle,双击install后就会把项目安装到本地仓库中,其他项目就可以通过坐标引用此项目。
注:请将项目test打包为jar包
再创建项目test1:让项目test1依赖项目test:
从上面可以证明:
项目test1依赖项目test,项目test依赖Mybatis工程,根据依赖的传递性,项目test1可以直接使用Mybatis工程。
10.1.5 排除依赖
在有些场景中,需要将传递的某部分依赖排除,可以通过exclusions标签实现。
exclusions: 用来排除传递性依赖。在exclusions标签中可配置多个exclusion标签,每个exclusion标签需要配置groupId, artifactId, version三项基本元素(注意:不用写版本号)。
比如:A--->B--->C (Mybatis.jar) 排除C中的Mybatis.jar
10.1.6 依赖范围
传递依赖发现可以通过使用如下的依赖范围来得到限制。依赖范围决定了依赖的坐标在什么情况下有效,什么情况下无效。
范围 | 描述 |
编译阶段(compile) | 该范围表明相关依赖是只在项目的类路径下有效,表明该依赖在编译和运行时都生效。默认取值。 |
供应阶段(provided) | 该范围表明相关依赖是由运行时的JDK或者网络服务器提供的,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入。 |
运行阶段(runtime) | 该范围表明相关依赖在编译阶段不是必须的,但是在执行阶段是必须的。也就是,编译时不需要生效,而只在运行时生效。 |
测试阶段(test) | 该范围表明相关依赖只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。 |
系统阶段(system) | 该范围表明你需要提供一个系统路径。与provided类似,不过必须显式指定一个本地系统路径的JAR,此类依赖应该一直有效,Maven也不会去仓库中寻找它。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。 |
导入阶段(import) | 该范围只在依赖是一个 pom 里定义的依赖时使用。同时,当前项目的POM 文件的 部分定义的依赖关系可以取代某特定的 POM。import范围只适用于pom文件中的<dependencyManagement>部分。表明指定的POM必须使用<dependencyManagement>部分的依赖。 |
案例:
定义一个父POM工程
定义一个子工程
结论:
子工程不用指定依赖的版本号,这样就可以在父工程进行统一管理。
如果父工程中加入score-import 相当于强制指定了版本号。
10.2 继承关系
如果A工程继承B工程,则代表A工程默认依赖B工程依赖的所有资源,且可以应用B工程中定义的所有资源信息。
被继承的工程(B工程)只能是POM工程。
注:在父项目中放在<dependencyManagement>中的内容是不被子项目继承,不可以直接使用。
放在<dependencyManagement>中的内容主要目的是进行版本管理。里面的内容在子项目中依赖时坐标只需要填写groupId和artifactId即可。(注意:如果子项目不希望使用父项目的版本,可以明确配置version)。
父工程:
子工程:
集成关系本质上是POM文件的继承 。
10.3 聚合关系
如果工程有2个以上模块时,每个模块都是一个独立的功能集合。比如某电商系统中拥有用户中心、商品中心、购物车中心等。在开发的时候每个中心都可以独立编译、测试和运行。这个时候就需要聚合工程。
创建聚合工程时,总的工程必须是一个POM工程(Maven Project)(聚合项目必须是一个pom类型的项目,jar项目和war项目是没有办法做聚合工程的),各子模块可以是任意类型模块(Maven Module)。
聚合包含了继承的特性。
聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目类型为pom类型。同时在父项目的pom.xml中出现<modules>表示包含的所有子模块。
父工程:
子模块:
十一、Maven 构建生命周期
Maven 构建生命周期定义了一个项目构建跟发布的过程。
一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的:
阶段 | 处理 | 描述 |
验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 |
编译 compile | 执行编译 | 源代码编译在此阶段完成 |
测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 |
包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 |
检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标 |
安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用 |
部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 |
十二、Maven常见插件
12.1 编辑器插件
通过编译器插件,我们可以配置使用的JDK或者说编译器的版本。
1.settings.xml文件中配置全局编译器插件。
通过找到profiles节点,在里面加入profile节点。
<profile>
<!-- 定义的编译器插件ID,全局唯一,名字随便起 -->
<id>jdk-1.8</id>
<!-- 插件标记,activeByDefault :true默认编译器,jdk提供编译器版本 -->
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<!-- 配置信息source-源信息,target-字节码信息,compilerVersion-编译过程版本 -->
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
2.配置编译器插件:pom.xml配置片段。
<!-- 配置maven的编译插件 -->
<build>
<plugins>
<!--JDK编译插件 -->
<plugin>
<!--插件坐标 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<!-- -->
<configuration>
<!-- 源代码使用JDK版本-->
<source>1.7</source>
<!-- 源代码编译为class文件的版本,要保持跟上面版本一致-->
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
12.2 资源拷贝插件
Maven在打包时默认只将src/main/resources里的配置文件拷贝到项目中并做打包处理,而非resource目录下的配置文件在打包时不会添加到项目中。
我们的配置文件,一般都放在:src/main/resources
然后打包后配置文件就会在target的classes下面放着:
如果想把非resources下面的文件也打包到classes下面,需要在pom.xml配置如下内容:
12.3 Tomcat插件
我们如果创建war项目,必然要部署在服务器上,有如下方式:
- 部署在远程服务器上。
- 将IDEA和外部Tomcat产生关联,然后将项目部署在外部tomcat上。
其实还有别的方式,不用依赖外部的Tomcat,Maven提供了Tomcat插件,我们可以配置来使用。
12.3.1 创建web项目(war项目)
使用Tomcat插件发布部署并执行war工程的时候,需要使用启动命令,启动命令为: tomcat7:run。
命令中的tomcat7是插件命名,由插件提供商决定;run为插件中的具体功能。
注意:
之前用的编译器插件和资源拷贝插件,不是可运行的插件,Maven直接帮我们运行了。但是Tomcat属于可运行插件,它什么时候工作需要程序员通过命令来运行控制。
具体pom.xml文件的配置如下:
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 配置Tomcat监听端口 -->
<port>8080</port>
<!-- 配置项目的访问路径(Application Context) -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
在浏览器中访问index.jsp页面:
相关推荐
- 建筑福利-pdf转dwg格式转换器,再也不用描图-极客青年
-
作为一名经常熬夜画图的建筑狗或者cad用户,你体验过pdf图纸描图到cad吗?前几天一个老同学找我,说他的毕业设计需要我帮忙,发给我一份pdf图纸文件,问我怎么把pdf图纸转换成dwg格式。机智的我灵...
- 想学 HTML,不知从何入手?看完这篇文章你就知道了
-
很多人都说HTML是一门很简单的语言,看看书,看看视频就能读懂。但是,如果你完全没有接触过,就想通过看一遍教程,背背标签,想要完全了解HTML,真的有点太天真了。HTML中文...
- 「前端」HTML之结构
-
今天继续为大家分享前端的知识,如果对前端比较感兴趣的小伙伴,可以关注我,我会更大家继续分享更多与前端相关的内容,当然如果内容中又不当的或者文字错误的,欢迎大家在评论区留言,我会及时修改纠正。1.初识H...
- 手把手教你使用Python网络爬虫下载一本小说(附源码)
-
大家好,我是Python进阶者。前言前几天【磐奚鸟】大佬在群里分享了一个抓取小说的代码,感觉还是蛮不错的,这里分享给大家学习。...
- 用于处理pdf文件格式的转换器
-
在上传过程中如果单个文件太大则容易中断,而且文件太大的话对与存储也有些弊端。那么我们应该想到将文件进行压缩(注意这里压缩指的是不改变文件格式的压缩,而不是用变成压缩文件。这里就将以下用专门的软件压缩P...
- 乐书:在线 Kindle 电子书制作和转换工具
-
之前Kindle伴侣曾推荐过可以在Windows和Mac系统平台上运行的kindle电子书制作软件Sigil(教程),用它可以制作出高质量的的ePub格式电子书,当然最后还需要通...
- 付费文档怎么下载?教你5种方法,任意下载全网资源
-
网上查资料的时候,经常遇到需要注册登录或者付费的才能复制或者是下载,遇到这种情况大多数人都会选择重新查。...
- 捡来的知识!3种方法随便复制网页内容,白嫖真香呀
-
网上的资源真的多,所以许多人常常会从网上找资料。我们看到感兴趣的内容,第一时间可能会想要收入囊中。比如说截个图啊,或者挑选有意思的句子复制粘贴,记录下来。可是,有些时候,却会遇到这样的情况:1、内容不...
- AI的使用,生成HTML网页。
-
利用deepseek,豆包,kimi以及通义千问,写入相同的需求。【写一个网页,实现抽奖功能,点击“开始”,按键显示“停止”,姓名开始显示在屏幕上,人员包括:“张三”,“里斯”,“Bool”,“流水废...
- pdf转换成jpg转换器 4.1 官方正式版
-
pdf转换成jpg工具软件简介pdf转换成jpg转换器是一款界面简洁,操作方便的pdf转换成jpg转换器。pdf转换成jpg转换器可以将PDF文档转换为JPG,BMP,GIF,PNG,TIF图片文件。...
- 办公必备的office转换成pdf转换器怎么用?
-
2016-02-2415:53:37南方报道网评论(我要点评)字体刚从校园走出社会,对于快节奏的办公环境,难免会觉得有些吃力。在起步阶段力求将手头上的事情按时完工不出错,但是渐渐的你会发现,别人只...
- 为什么PDF转Word大多要收费?
-
PDF转Word大多都要收费?并非主要是因为技术上的难度,而是基于多方面的商业和版权考虑的,下面给大家浅分析下原因:...
- 如何用python生成简单的html report报告
-
前提:用python写了一个简单的log分析,主要也就是查询一些key,value出来,后面也可以根据需求增加。查询出来后,为了好看,搞个html表格来显示。需要的组件:jinja2flask...
- 学用系列|如何搞定word批量替换修改和格式转换?这里一站搞定
-
想必不少朋友都会碰到批量修改word文档内容、压缩文档图片、文件格式转换等重复性文档处理工作的需要,今天胖胖老师就推荐给大家一个免费工具XCLWinKits,一站搞定你所有的需要。什么是XCLWinK...
- 这款PDF文档转换神器,能帮你解决PDF使用中的许多难点
-
不管是平时的学习还是工作,相信许多朋友都经常接触PDF文件。可以说,PDF文件在我们的日常办公学习过程中的重要性和Word文档一样重要。在之前的更新中,小编介绍了几款非常不错的PDF文档格式转换软件,...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)