Maven入门学习笔记

news2024/11/16 13:26:32

一、maven介绍

Maven是一款自动化构建工具,专注服务于JAVA平台的项目构建和依赖管理。在javaEE开发的历史上构建工具的发展也经历了一系列的演化和变迁。

管理jar包

当我们使用SSM之后我们就需要使用非常多的jar包

没有maven找jar包非常的麻烦。

使用maven下载,快捷,方便,便捷。

jar包之间复杂的依赖关系maven也可以非常方便的处理。

jar包之间复杂的引用关系,不可能通过人工来管理,因为其非常的复杂。

Maven作为构建管理工具

之前的构建是idea帮我们完成的也就是,在部署javaweb时的工件,war包是idea自动替我们生成出来了,idea帮我们做了打包和部署的工作。运行后出来的out目录就是编译后得到的文件。

在Tomact中真正运行的是out目录中的文件,也就是编译后的out目录。

1.maven是用来管理规模庞大的jar包。

2.maven可以让web程序脱离IDE环境执行,也就是发布给用户使用。

1.2:构建环节

构建不等于创建,构建就是使用原材料来生产产品。就是用你写的代码组成一个最终的产品。也就是在服务器上运行的项目,能提供给用户使用。

(1)清理:删除以前的编译结果,为重新编译做好准备。

(2)编译:将java源码程序编译为字节码文件。

(3)测试:运行单元测试用例程序,确报项目在开发过程中关键点的正确性。

(4)报告:测试程序的结果。

(5)打包:将java项目打成jar包;将web项目打成war包。

(6)安装:将jar包或war包安装到本地仓库

(7)部署:将jar包或war从Maven仓库中部署到Web服务器上运行。

对结构进行了统一:

把一个项目运用对象的管理的方式去管理。

1.3:依赖

如果工程A里面用到了B工程的接口、类、配置文件等等这样的资源,那么我们是A依赖于B

对A来说没有B,A就不能正常工作。

1.4:Maven的工作机制

二、Maven下载与安装配置

2.1:Maven下载:

官网:

Maven – Welcome to Apache Maven

下载地址:

http://maven.apache.org/download.cgi

2.2:配置MAVEN—HOME

三、Maven的仓库和坐标

3.1:仓库:用于存储资源,包含各种jar包。

中央仓库都是开源的。

私服不是开源的。

3.2:坐标:用于查找需要的资源

Maven中的坐标用于描述仓库中资源的位置

Central Repository:

https://mvnrepository.com

用于查找你需要的jar包和资源。

坐标的书写方式,通过复制粘贴的方式使用。

3.3:本地仓库配置:

1.执行mvn后C:\Users\Administrator路径下会出现.m2文件夹,这个就是你的仓库

因为C盘为系统盘,为了系统的流畅我们需要修改仓库的位置

2.修改仓库位置

在maven中的conf文件夹中的setting文件中修改默认的仓库位置

这样就配置好了本地仓库的位置。

3.4:远程仓库配置:

将获取网址改为国内的阿里镜像仓库网址

将这段代码加入到setting.xml文件中的mirror标签中

3.5:全局setting和用户setting用户的区别

  • 全局就是所有用户登录都会按照setting中的配置。

  • 用户setting就是不同用户登录有自己个性化的setting配置。

在本地仓库中再建立一个setting文件,这样就可以实现用户的自定义个性化的setting配置。

四、第一个Maven项目(手工制作)

4.1:Maven工程目录结构

4.2:Maven的pom配置

maven工程要求再src的同级目录下创建一个pom.xml文件来管理项目

这样目录结构就做好了,接下来需要构建项目。

4.3:Maven项目构建命令

在pom所在文件夹进入cmd执行

4.3.1:maven的编译(mvn compile)

执行编译后会下载所需要的插件,执行compile所对应的插件,也是maven项目所需要的东西,我们现在就是将各种东西拼凑出一个maven项目。mvn compile命令可以用来编译,当你的文件中没有能编译的环境时,它就会下载所需要的插件,来帮助它完成编译操作。

下载完成后编译,编译完成后显示编译成功

编译完成后多出一个目录target

target中放的就是编译完成的结果

target文件夹中的classes文件夹中放的是源程序编译后字节码。

test-classes中放的是测试程序编译后生成的字节码

4.3.2:maven清理编译(mvn clean)

同样是先下载运行命令所需要的插件

然后执行命令的功能

清理完成后target文件夹将会被清空

4.3.3:maven测试(mvn test)

在target文件下的surefire-reports中的txt文件中可以看到测试的结果。

详细信息在xml文件中,xml文件中有测试所用到的各种东西的信息,比如jdk版本所用字符集等。

4.3.4:maven打包(mvn package)

maven只会打包你的源程序

打包指令会先将你的项目编译,然后执行测试程序,当测试程序没有问题之后再进行打包

打包的结果放到target文件夹下

就是这个后缀为jar的文件。

4.3.5:maven安装(mvn install)

就是把现在的项目放到本地仓库里

放在com文件夹下

在pom文件中配置的groupid为com.itheima所以放到了com文件夹下

maven安装也会执行一遍编译和测试,以便于确保打包的准确性

4.4:使用模板创建Maven工程

使用模板来创建工程

在目录中执行命令就可以快速的创建一个maven项目

4.5:pom.xml解读

pom.xml是maven工程的核心配置文件,后续所要做的所有的配置都是在pom.xml中做的。

甚至可以说我们学习maven怎么用就是在学pom.xml怎么用。

<!--project标签:根标签:project project就是工程的意思可以翻译成工程也可以翻译成项目,代表着我们这个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标签:从maven2固定是4.0.0  代表当前pom.xml所采用的标签结构-->
  <modelVersion>4.0.0</ modelVersion>

  <!--
  groupId 标签:坐标向量之一:代表公司或组织开发的某一个项目
  artifactId标签:坐标向量之一:代表项目下的某一个模块
  version标签:坐标向量之一:代表当前模块的版本
  就是我们的坐标信息,工程的坐标信息简称gav

  -->

  <groupId>com.atiguigu.maven</groupId>
  <artifactId>pro01-maven-java</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--packaging标签:当前maven工程打包的方式,默认方式是以jar包的方式进行打包,生成jar包说明这是一个java工程,如果取值是war那么打包说明这是一个web工程-->
  <!--取值pom:说明这个这个工程是用来管理其它工程的工程-->
  <packaging>jar</packaging>

<!--name是工程名-->
  <name>pro01-maven-java</name>
 <!--url是maven的官网-->
  <url>http://maven.apache.org</url>
<!--properties标签:在Maven中定义属性值,其中包含的标签是属性名,其中的内容是属性值,可以是maven给我们提供的属性值也可以是我们自定义的属性值-->
  <properties>
  <!--在构建过程中读取源码时使用的字符集-->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
<!--dependencies 标签:配置具体依赖信息,就是通过dependencies来导入jar包-->
  <dependencies>
  <!--dependency 标签用来配置一个具体的依赖信息-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
      <!--
      通过坐标来指定依赖,想导入哪个jar包就配置她的坐标信息即可
      scope标签用来配置当前依赖的范围。就像junit就是用来做单元测试的它的范围就是test
      -->

    </dependency>
  </dependencies>
</project>

4.6: Maven核心概念:POM

4.6.1:含义

POM:Project Object Model,项目对象模型。和POM类似的是DOM(Document Object Model),文档对象模型,它们都是模型化思想的具体体现。

4.6.2:模型化思想

POM表示将工程抽象为一个模型,再用程序中的对象来描述这个模型,这样我们就可以用程序来管理项目了。我们在开发过程中,最基本的做法就是将生活中的事物抽象为模型,然后封装模型相关的的数据作为一个对象,这样就可以在程序中计算与现实事物相关的数据。

4.6.3:对应的配置文件

POM理念集中体现在Maven工程根目录下pom.xml这个配置文件中。所以这个pom.xml配置文件就是Maven工程的核心配置文件。其实学习Maven就是学习这个文件怎么配置,各个配置有什么用。

4.7:简单的maven程序测试

程序代码

测试代码

4.8:创建Maven版的Web工程

1.说明

使用mvn archetype:generate命令生成web工程时,需要使用一个专门的archtype.这个专门生成web工程骨架的archtype可以参照官网看它的用法:

2.操作

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -Da

 运行完这个命令目录结构为

接下来需要自己创建servlet和test目录 

7.编译

此时直接执行编译会报错,因为缺少HttpServlet程序包(类)不存在。

我们需要自己去导入包

HttpServlet这个类是在servlet-api这个jar包中,所以我们要导入这个包。

8.配置对servlet-api.jar包的依赖:

https://mvnrepository.com/

网站查询到相应的jar包并使用。

 

五、让Web工程去依赖Java工程(两个工程都是我们之前创建的,这里学习怎样依赖我们自己创建的工程)

5.1:观念

明确从来只有Web工程依赖java工程,没有java工程依赖Web工程。本质上来说,Web工程依赖的Java工程实际上就是导入Web工程中的jar包。最终java工程会变成jar包放在Web工程的WEB-INF/lib目录下。

5.2:操作

只需要在pom.xml中加入对应java工程的坐标就可以了

创建test目录将TestHelloServlet.java复制到test目录中执行mvn test这时是可以正确执行的也就是我们通过maven将我们的java工程导入到了我们的web工程这时候我们再对pro02项目进行打包,导入的java工程的jar包就会出现在WEB-INF/lib文件夹下

六、测试依赖的范围

6.1:依赖范围

标签的位置:dependencies/dependency/scope

标签的可选值:

  1. compile(编译范围):这是<scope>标签的默认选项。被标记为compile的依赖会在项目的编译、测试和运行阶段都被包含进来。在项目打包时,这些依赖会被打入最终的包里面。
  2. test(测试范围):被标记为test的依赖仅在测试阶段有效,它们不会被包含进最终的打包结果中。这适用于仅在测试时需要的库,比如JUnit或TestNG等测试框架。
  3. runtime(运行时范围):runtime范围的依赖在运行和测试阶段可用,但在编译阶段不可用。这通常用于那些在编译时期不需要,但在运行时期需要用到的依赖项。
  4. provided(已提供范围):provided依赖在编译和测试时有效,但在运行时预期由容器或运行环境提供。例如,当你的Web应用运行在Servlet容器中时,servlet-api就是一个provided依赖,因为容器已经提供了这个API。
  5. system(系统范围):system范围的依赖与provided类似,它表示依赖在编译和测试时有效,但不会在运行时由Maven自动提供,必须手动提供。这种类型的依赖很少使用,因为它破坏了Maven跨平台一致性的目标。
  6. import(导入范围):import范围的依赖只在dependencyManagement中使用,它不会影响到实际的项目依赖树。也就是说,这样的依赖不会被传递到项目的其他部分。
  7. optional(可选范围):被标记为optional的依赖意味着即使没有这个依赖,项目也能正常构建。它通常用于可选功能,如果存在,可以增加一些附加的功能,但并不是必需的。

 

 

 七、Maven之间的依赖传递

7.1:compile依赖传递

只要与上一级依赖的关系是compile就可以传递给之后的依赖使用

mvn dependency:tree

mvn dependency:list

7.2:compile依赖传递中的版本冲突 

如图所示,如果B和C都依赖与D但是所依赖的版本不同,那么就会出现冲突,这时我们只需要在A依赖B时做配置,那么A项目中就不再会有D0.1的版本,同时不影响B对D0.1的依赖。 

八、Maven中的继承

8.1:概念

Maven工程之间,A工程继承B工程

  • B工程:父工程

  • A工程:子工程

Maven中的继承本质上就是POM.XML文件的继承

本质上是A工程中的pom.xml中的配置继承了B工程中的pom.xml的配置。

8.2:作用

在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本

作用:将父工程作为模板,模板内容就是依赖的jar包,以这个模板开发众多项目,当模板改变时因为开发的项目是该模板的子工程,这时就可以通过修改父工程来实现一处修改,处处生效,避免了模板改动,所有子项目都需要一,一改动,避免了重复无意义的工作。

8.3:创建父工程

父工程中是不写java程序的仅仅提供pom文件即可。

不写java代码

8.4:在父工程中创建子工程 

8.5:在父工程中统一管理依赖信息 

在父工程中管理这些依赖,后子工程并不会直接能使用这些依赖。

想要使用依赖仍旧要引用,但是不用再写版本号,因为父类已经选好了

  • 情况一:子工程省略version标签

    子工程使用的依赖版本就是父工程管理的依赖版本。

  • 情况二:没有省略version标签

    1.和父工程管理的版本一样:多此一举

    2.和父工程管理的版本不一样:子工程指定的版本覆盖了父工程管理的版本最终采纳的子工程中配的

子工程按自己的需要从父工程中拿就好,不用全部拿过来。

如果想升级依赖版本,在父工程中一处修改,处处生效

8.6:通过配置自定义属性来实现只修改一处就可以改变所有

 通过引用的方式来实现动态的修改所有引用该值的依赖版本

8.7:父工程的实际意义

实践层面的意义就是可以吸取公司之前的项目经验使用合适的依赖版本,不用反复的造轮子,而是将更多的时间放到项目的功能开发。

九、聚合

9.1:配置方式

就是modules标签里面配moudle

9.2:配置聚合的意义

聚合就是部分组成整体,各个模块组成了我们整个的项目。

项目:整体

模块:部分

在总工程中执行mvn命令其中的模块也能同时执行。

总工程中会自动去按照项目之间依赖的关系来执行mvn命令。

例如在4中依赖5

在5中依赖6

那么在3中执行mvn install命令就会先安装6再安装5再安装4

这个时候不能让6依赖4,不能形成闭环,不然就会报错。 

十、在IDEA中使用Maven

10.1:创建父工程并配置Maven信息

10.1.1:设置idea中的Maven仓库地址为自己的地址

同时将配置文件改成自己的

 

10.1.2:修改POM文件

修改pom文件为自己需要的样子。

10.2:创建子工程模块

10.2.1:创建java模块工程

新建工程模块后父工程中IDEA会帮我们添加packing标签为pom,modules标签为子工程名

10.2.2:测试java子工程模块

1.导入junit,(如果是我们不熟悉的就去网站找然后复制配置信息)

2.编写测试程序

在main的java目录下编写程序

3.在test的java目录下编写测试程序 

4.运行测试程序

10.2.3:创建Web子工程模块

创建web子工程模块,选择webapp的archtype

10.2.4:编写web测试程序

1.java程序

2.index.jsp页面

3.配置本地Tomact 

4..测试效果

需要注意的是maven对web工程的目录上下级有特殊的要求如果没有按照要求来,那么打包的时候会出问题,所以建议使用maven的模板来创建工程

10.3:工程导入

怎样导入别人的maven工程

找到pom.xml存在的目录idea就能够识别,将它打开。

每一个新的project需要重新配置本地仓库位置,项目中的moudle则不需要。

10.4:模块导入

10.4.1:将需要导入的模块文件夹放入项目

这个时候IDEA还没有将其检测为模块,只是看成一个普通的文件夹

10.4.2:添加为模块

让IDEA以Maven的方式来导入文件夹为模块

当添加的模块为web模块时要配置正确的web.xml路径,否则maven在打包时不能正确的识别并进行打包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一次开发,多端部署--实例介绍

一、自适应布局 1、拉伸能力 容器组件尺寸发生变化时&#xff0c;增加或减小的空间全部分配给容器组件内指定区域。 Row() {// 通过flexGrow和flexShrink属性&#xff0c;将多余的空间全部分配给图片&#xff0c;将不足的控件全部分配给两侧的空白区域Row().width(150).flexG…

【代码随想录训练营第42期 Day57打卡 - 图论Part7 - Prim算法与Kruskal算法

目录 一、Prim算法 二、题目与题解 题目&#xff1a;卡码网 53. 寻宝 题目链接 题解1&#xff1a;Prim算法 题解2&#xff1a;Prim算法优化 题解3&#xff1a;Kruskal算法 三、小结 一、Prim算法与Kruskal算法 Prim算法是一种贪心算法&#xff0c;用于求解加权无向图的…

差分约束---将不等式转换为图的算法

概念&#xff1a;已知一个差分约束系统&#xff08;差分约束系统即一种特殊的n元一次不等式组&#xff09;&#xff0c;形如,要求求出是否存在一组解使得所有约束条件满足。由于在最短路中与该不等式形式相似&#xff0c;因此&#xff0c;可以利用图论&#xff0c;从对应的j点连…

探索Web3前沿:革新性算力共享平台,重塑数字资源利用新时代

基于Web3的算力共享平台 随着区块链技术的不断发展和Web3.0时代的到来,算力共享平台逐渐成为推动数字经济和人工智能发展的重要力量。基于Web3的算力共享平台通过去中心化、分布式网络等技术手段,实现了算力的高效、透明和安全的共享,为人工智能、科学研究、艺术创作等多个…

Kamailio-基于Homer与heplify的SIP信令监控-1

接上篇Kamailio监控&#xff0c;对Kamailio的一个基础监控有了一定的概念&#xff0c;但是光看数字如果发现问题&#xff0c;要如何回顾解决呢&#xff1f;生产环境不能随时随地抓包来确定链路的正常与否。 这个时候 Sipcapture 公司推出了Homer这个开源软件&#xff0c;目前G…

【软件测试】常用的开发、测试模型

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【软件测试】常用的开发、测试模型&#xff0c;首先了解, 什么是软件的生命周期, 测试的生命周期, 常见的开发模型: 瀑布, 螺旋, 增量, 迭代, 敏捷. 常用的测试模型, …

银河麒麟桌面系统卸载应用报错快速解决

银河麒麟桌面系统卸载应用报错快速解决 1、问题简述2、解决方案步骤 1: 删除dpkg信息步骤 2: 强制卸载步骤 3: 验证与清理 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、问题简述 在银河麒麟桌面系统中卸载应用时&#xff0c;可能会遇…

AE 让合成重复循环播放

在合成上点右键 > Time > Enable Time Remapping 按住 Alt 键&#xff0c;点秒表图标 输入 loop_out("cycle", 0) 将子合成拖到此合成结束的位置 结束

Linux 上自动下载 Docker 依赖并离线安装的完整指南

Linux 上自动下载 Docker 依赖并离线安装的完整指南 文章目录 Linux 上自动下载 Docker 依赖并离线安装的完整指南一 添加软件源二 更新 yum 缓存三 下载依赖四 打包 rpm 文件五 离线安装 这篇指南详细讲解了如何在CentOS 7.9系统上&#xff0c;通过 yum命令自动下载Docker的所…

vue3使用leaflet+trackplayer实现非地图动画轨迹(市场平面图动态轨迹)

vue3使用leaflettrackplayer实现非地图动画轨迹(市场平面图动态轨迹) 先下载 leaflet 和 leaflet-trackplayer两个主要库 leaflet官方文档 npm install leaflet npm install leaflet-trackplayer然后在页面中引用 html <template><button click"playMap&quo…

LLM - 理解 多模态大语言模型 (MLLM) 的指令微调与相关技术 (四)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142063880 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 完备(F…

第 12 篇 Helm 部署 Redis

文章目录 Redis Chart部署 Redis 单机版部署 Redis 哨兵版第 1 步&#xff1a;准备 values.yaml 配置文件第 2 步&#xff1a;安装 bitnami/redis第 3 步&#xff1a;解决 Pod Pending 问题查看 Pod 状态添加 PV 持久化卷创建 pv1创建 pv2创建 pv3 查看 Pod 状态 第 4 步&#…

java实际开发——数据库存储金额时用什么数据类型?(MySQL、PostgreSQL)

目录 java开发时金额用的数据类型——BigDecimal MySQL存储金额数据时用的数据类型是——decimal PostgreSQL存储金额数据时用的数据类型是——decimal 或 money java开发时金额用的数据类型——BigDecimal https://blog.csdn.net/Jilit_jilit/article/details/142180903?…

传统Malmquist-Luenberger指数与全局Malmquist-Luenberger指数的区别

1.全局技术前沿的构建 1.1传统ML指数 技术前沿的时间依赖性 传统的Malmquist-Luenberger&#xff08;ML&#xff09;指数在每个时期&#xff08;例如年份&#xff09;单独构建各自的技术前沿。这意味着每个时期的生产可能性集合和技术效率都是基于该时期的数据。 不可比性问…

【包教包会】CocosCreator3.xSprite和Label渐变色(支持3.x、支持原生、可合批)

完美适配Web、原生平台&#xff08;其余平台没测过&#xff09;。 下载地址&#xff1a;水煮肉片饭/Palette3.x 如何导入自己项目&#xff1a; 1、将Demo中Palette.ts复制到自己项目assets目录下 2、新建一个Sprite或Label节点&#xff0c;将Palette组件挂上去 3、设置顶点…

openstack之glance介绍

概念 glance为nova提供镜像服务&#xff0c;用于启动实例&#xff0c;预建镜像已安装cloud-init&#xff0c;可以访问openstack基金会获取操作系统镜像&#xff1a;官方镜像 格式 raw&#xff1a;无格式的镜像&#xff1b; vhd&#xff1a;hyper-v使用的格式&#xff1b; vm…

arcgisPro地理配准

1、添加图像 2、在【影像】选项卡中&#xff0c;点击【地理配准】 3、 点击添加控制点 4、选择影像左上角格点&#xff0c;然后右击填入目标点的投影坐标 5、依次输入四个格角点的坐标 6、点击【变换】按钮&#xff0c;选择【一阶多项式&#xff08;仿射&#xff09;】变换 7…

数据结构(7.3_1)——二叉排序树

二叉排序树&#xff0c;又称二叉查找树(BST,Binary Search Tree) 一棵二叉树或者是空二叉树&#xff0c;或者是具有如下性质的二叉树&#xff1a; 左子树上所有结点的关键字均小于根结点的关键字&#xff1b;右子树上所有结点的关键字均大于根结点的关键字&#xff1b;左子树…

系统优化工具 | PC Cleaner v9.7.0.3 绿色版

PC Cleaner是一款功能强大的电脑清理和优化工具&#xff0c;旨在通过清理系统垃圾文件、解除恶意软件和优化系统性能来提高计算机的运行效率。该软件提供了多种功能&#xff0c;可以帮助用户维护和提升计算机的整体表现。 PC Cleaner 支持 Windows 7 及以上操作系统&#xff0…

餐饮+KTV点歌一体化思路-—SAAS本地化及未来之窗行业应用跨平台架构

一、餐饮KTV点歌一体化 1. 多元化体验&#xff1a;为顾客提供了餐饮和娱乐的双重享受&#xff0c;满足了不同需求&#xff0c;增加了顾客的停留时间和消费可能性。 2. 增加消费机会&#xff1a;顾客在享受美食的同时可以唱歌娱乐&#xff0c;可能会增加酒水、小吃等额外消费。…