Maven入门学习笔记

一、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在打包时不能正确的识别并进行打包。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单了解 JVM

目录 ♫什么是JVM ♫JVM的运行流程 ♫JVM运行时数据区 ♪虚拟机栈 ♪本地方法栈 ♪堆 ♪程序计数器 ♪方法区/元数据区 ♫类加载的过程 ♫双亲委派模型 ♫垃圾回收机制 ♫什么是JVM JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模…

WPF DataGrid 列表中,DataGrid.Columns 列根据不同的值显示不同内容

需求&#xff1a;在WPF DataGrid 控件中&#xff0c;有以下列&#xff0c;绑定了一个LogType&#xff0c;值分别是0,1,2&#xff0c;根据不同的值&#xff0c;显示不同的内容以及背景 <DataGrid ItemsSource"{Binding EventLog}"><DataGrid.Columns><…

代码管理工具——git及阿里云云效的使用(包含git的使用及云效自动化部署)

1、做项目开发时都会用到代码管理工具,像是我之前使用过gitHub,Visual Studio等一些代码管理工具&#xff0c;这里介绍的是阿里云云效的使用。 2、首先登录阿里云云效&#xff0c;登录进去之后会看到公司给你开放的一个仓库。 3、进入仓库&#xff0c;点击克隆/下载&#xff0…

Google大数据架构技术栈

数据存储层 Colossus Colossus作为Google下一代GFS&#xff08;Google File System&#xff09;。 GFS本身存在一些不足 单主瓶颈 GFS 依赖单个主节点进行元数据管理&#xff0c;随着数据量和访问请求的增长&#xff0c;出现了可扩展性瓶颈。想象一下&#xff0c;只有一位…

网红酒店|基于java的网红酒店预定系统(源码+数据库+文档)

酒店预定|网红酒店|网红酒店预定系统 目录 基于java的网红酒店预定系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&am…

R语言统计分析——功效分析(比例、卡方检验)

参考资料&#xff1a;R语言实战【第2版】 1、比例检验 当比较两个比例时&#xff0c;可使用pwr.2p.test()函数进行功效分析。格式为&#xff1a; pwr.2p.test(h, n, sig.level, power, alternative) 其中&#xff0c;h是效应值&#xff0c;n是各相同的样本量。效应值h的定义如…

智能头盔语音识别声控芯片,AI离线语音识别ic方案,NRK3301

头盔是交通事故中保护电动车车主安全的最后一道屏障。为了增加骑行用户的安全保护&#xff0c;改善骑行用户的出行体验&#xff0c;让用户从被动使用头盔到主动佩戴头盔&#xff0c;头盔厂家与九芯电子合作&#xff0c;推出了语音智能头盔&#xff0c;它具备首家骑行专用的智能…

C++核心编程和桌面应用开发 第三天(C和C++的封装)

目录 1.封装 1.1C语言封装缺陷 1.2C下的封装 1.3封装的访问权限 2.C中struct和class的区别&#xff1a; 1.封装 1.1C语言封装缺陷 1.2C下的封装 优点1&#xff1a;将属性和行为作为整体&#xff0c;表现生活中的事务 优点2&#xff1a;将属性和行为加以访问权限控制 1…

vue的路由

v2用3版本&#xff0c;v3用4版本 import Vue from vue import VueRouter from vue-router Vue.use(VueRouter) const routes [] const router new VueRouter({ routes }) export default router import Vue from vue import App from ./App.vue import router from /router V…

kkFileView PDF Image Mode Preview BUG

kkFileView PDF & Image Mode Preview BUG lazyload.js officePicture.ftl pdf.ftl kkFileView getCorsFile?urlPath 会触发SSRF漏洞 kkFileView SSRF-CSDN博客 commonHeader.ftl initWaterMark() 修改代码的工作量&#xff0c;主要是先部署项目&#xff0c;解…

微信小程序开发——比较两个数字大小

在这里我们使用的工具是 需要自行安装和配置。 在微信小程序中比较两个数字大小有以下几种方式&#xff1a; 一、普通条件判断 在小程序的.js 文件中&#xff0c;先定义两个数字&#xff0c;如let num1 5; let num2 3;。通过if - else if - else语句&#xff0c;根据num1与…

Machine Learning: A Probabilistic Perspective 机器学习:概率视角 PDF免费分享

下载链接在博客最底部&#xff01;&#xff01; 之前需要参考这本书&#xff0c;但是大多数博客都是收费才能下载本书。 在网上找了好久才找到免费的资源&#xff0c;浪费了不少时间&#xff0c;在此分享以节约大家的时间。 链接: https://pan.baidu.com/s/1erFsMcVR0A_xT4fx…

TypeScript:泛型

一、简介 软件工程中&#xff0c;我们不仅要创建一致的定义良好的API&#xff0c;同时也要考虑可重用性。 组件不仅能够支持当前的数据类型&#xff0c;同时也能支持未来的数据类型&#xff0c;这在创建大型系统时为你提供了十分灵活的功能。 在像C#和Java这样的语言中&#x…

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

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

16 训练自己语言模型

在很多场景下下&#xff0c;可能微调模型并不能带来一个较好的效果。因为特定领域场景下&#xff0c;通用话模型过于通用&#xff0c;出现多而不精。样样通样样松&#xff1b;本章主要介绍如何在特定的数据上对模型进行预训练&#xff1b; 训练自己的语言模型&#xff08;从头开…

DSLogic 逻辑分析仪的使用-I2C协议

一、I2C IIC-BUS&#xff08;Inter-IntegratedCircuit Bus&#xff09;最早是由PHilip半导体&#xff08;现在被NXP收购&#xff09;于1982年开发。 主要是用来方便微控制器与外围器件的数据传输。 它是一种半双工&#xff0c;由SDA&#xff08;数据&#xff09;和SCL&#xf…

USBCANFD卡再汽车电子行业中得应用

随着汽车电子的高速发展&#xff0c;车内信息的急剧增多&#xff0c;传统的CAN总线的数据传输能力已经很难满足车辆ECU的数据传输需求了&#xff0c;此时CANFD就应运而生了。 CANFD和CAN最主要的区别就是CANFD的ID段和数据段能够以不同的速率传输数据&#xff0c;这就保证了即使…

[数据集][目标检测]男女性别检测数据集VOC+YOLO格式9769张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9769 标注数量(xml文件个数)&#xff1a;9769 标注数量(txt文件个数)&#xff1a;9769 标注…

使用 Milvus、vLLM 和 Llama 3.1 搭建 RAG 应用

vLLM 是一个简单易用的 LLM 推理服务库。加州大学伯克利分校于 2024 年 7 月将 vLLM 作为孵化项目正式捐赠给 LF AI & Data Foundation 基金会。欢迎 vLLM 加入 LF AI & Data 大家庭&#xff01;&#x1f389; 在主流的 AI 应用架构中&#xff0c;大语言模型&#xff0…

前端技术(七)——less 教程

一、less简介 1. less是什么&#xff1f; less是一种动态样式语言&#xff0c;属于css预处理器的范畴&#xff0c;它扩展了CSS语言&#xff0c;增加了变量、Mixin、函数等特性&#xff0c;使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 &#xff0c;也可以借助Node.js在服…