maven学习笔记总结

目录

一、maven简介

二、GAVP属性

三、基于 IDLE 的 Maven 工程创建

1)java标准工程(Javase)的创建

2)java企业工程(Javaee)的创建

a)手动创建

b)插件方式创建(file / settings / plugins / marketplace)

四、Maven工程项目结构说明

五、依赖管理和配置

六、依赖传递和依赖冲突(不用管,就是一种原理说明,总之用maven导入总是对的)

七、依赖导入失败场景和解决方案

八、构建概念

九、继承与聚合

1、继承语法

2、父工程依赖统一管理

3、聚合概念

4、聚合作用

5、聚合语法

6、聚合演示

十、总结


一、maven简介

Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。

二、GAVP属性

Maven工程相对之前的工程,多出一组gavp属性,gav需要我们在创建项目的时指定,p有默认值,后期通过配置文件修改。

既然要填写的属性,我们先行了解下这组属性的含义!

Maven 中的 GAVP 是指 GroupIdArtifactIdVersionPackaging 等四个属性的缩写,其中前三个是必要的,而 Packaging 属性为可选项。

这四个属性主要为每个项目在maven仓库总做一个标识,类似人的《姓-名》。有了具体标识,方便maven软件对项目进行管理和互相引用!

GAV遵循一下规则:

1) GroupID 格式:com.{公司/BU }.业务线.[子业务线],最多 4 级。

    说明:{公司/BU} 例如:alibaba/taobao/tmall/aliexpress 等 BU 一级;子业务线可选。

    正例:com.taobao.tddl 或 com.alibaba.sourcing.multilang  com.atguigu.java

2) ArtifactID 格式:产品线名-模块名。语义不重复不遗漏,先到仓库中心去查证一下。

    正例:tc-client / uic-api / tair-tool / bookstore

3) Version版本号格式推荐:主版本号.次版本号.修订号 1.0.0

    1) 主版本号:当做了不兼容的 API 修改,或者增加了能改变产品方向的新功能。

    2) 次版本号:当做了向下兼容的功能性新增(新增类、接口等)。

    3) 修订号:修复 bug,没有修改方法签名的功能加强,保持 API 兼容性。

    例如: 初始→1.0.0  修改bug → 1.0.1  功能调整 → 1.1.1等

Packaging定义规则:

  指示将项目打包为什么类型的文件,idea根据packaging值,识别maven项目类型!

  packaging 属性为 jar(默认值),代表普通的Java工程,打包以后是.jar结尾的文件。

  packaging 属性为 war,代表Java的web工程,打包以后.war结尾的文件。

  packaging 属性为 pom,代表不会打包,用来做继承的父工程。

三、基于 IDLE 的 Maven 工程创建

1)java标准工程(Javase)的创建

先创建一个空项目,方便以后把所有项目都放在该目录之下

再new一个新的module

Javase创建完毕(注意:此处省略了version,直接给了一个默认值<version>1.0-SNAPSHOT</version>。自己后期可以在项目中随意修改!)

2)java企业工程(Javaee)的创建

a)手动创建

创建一个javase maven工程

手动添加web项目结构文件

最后进行刷新和校验

项目的webapp文件夹出现小蓝点,代表成功!!

b)插件方式创建(file / settings / plugins / marketplace)

创建一个javase maven工程

右键、使用插件快速补全web项目

若小蓝点没出来,重启ldea就行。

四、Maven工程项目结构说明

Maven 是一个强大的构建工具,它提供一种标准化的项目结构,可以帮助开发者更容易地管理项目的依赖、构建、测试和发布等任务。

以下是 Maven Web 程序的文件结构及每个文件的作用:

- pom.xml:Maven 项目管理文件,用于描述项目的依赖和构建配置等信息。

- src/main/java:存放项目的 Java 源代码。

- src/main/resources:存放项目的资源文件,如配置文件、静态资源等。

- src/main/webapp/WEB-INF:存放 Web 应用的配置文件。

- src/main/webapp/index.html:Web 应用的入口页面。

- src/test/java:存放项目的测试代码。

- src/test/resources:存放测试相关的资源文件,如测试配置文件等。

五、依赖管理和配置

Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。

我们通过定义 POM 文件,Maven 能够自动解析项目的依赖关系,并通过 Maven 仓库自动下载和管理依赖,从而避免了手动下载和管理依赖的繁琐工作和可能引发的版本冲突问题。

重点: 编写pom.xml文件!

maven项目信息属性配置和读取:

<!-- 模型版本 -->

<modelVersion>4.0.0</modelVersion>

<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->

<groupId>com.companyname.project-group</groupId>

<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->

<artifactId>project</artifactId>

<!-- 版本号 -->

<version>1.0.0</version>

<!--打包方式

    默认:jar

    jar指的是普通的java项目打包方式! 项目打成jar包!

    war指的是web项目打包方式!项目打成war包!

    pom不会讲项目打包!这个项目作为父工程,被其他工程聚合或者继承!后面会讲解两个概念

-->

<packaging>jar/pom/war</packaging>

依赖管理和添加:

​
<!--

   通过编写依赖jar包的gav必要属性,引入第三方依赖!

   scope属性是可选的,可以指定依赖生效范围!

   依赖信息查询方式:

      1. maven仓库信息官网 https://mvnrepository.com/

      2. maven search插件搜索

 -->

<dependencies>

    <!-- 引入具体的依赖包 -->

    <dependency>

        <groupId>log4j</groupId>

        <artifactId>log4j</artifactId>

        <version>1.2.17</version>

        <!--

            生效范围

            - compile :main目录 test目录   打包打包 [默认]

            - provided:main目录 test目录  Servlet

            - runtime: 打包运行                    MySQL

            - test:            test目录                      junit

         -->

        <scope>runtime</scope>

    </dependency>

</dependencies>

​

依赖版本提取和维护:

<!--声明版本-->

<properties>

  <maven.compiler.source>17</maven.compiler.source>

  <maven.compiler.target>17</maven.compiler.target>



  <!--命名随便,内部制定版本号即可!-->

  <junit.version>4.11</junit.version>

  <!-- 也可以通过 maven规定的固定的key,配置maven的参数!如下配置编码格式!-->

  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>



  </properties>



<dependencies>

  <dependency>

    <groupId>junit</groupId>

    <artifactId>junit</artifactId>

    <!--引用properties声明版本 -->

    <version>${junit.version}</version>

  </dependency>

</dependencies>

六、依赖传递和依赖冲突(不用管,就是一种原理说明,总之用maven导入总是对的)

依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B,而 B 又依赖于模块或库 C,那么 A 会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。

当我们引入一个库或框架时,构建工具(如 Maven、Gradle)会自动解析和加载其所有的直接和间接依赖,确保这些依赖都可用。

依赖传递的作用是:

1. 减少重复依赖:当多个项目依赖同一个库时,Maven 可以自动下载并且只下载一次该库。这样可以减少项目的构建时间和磁盘空间。

2. 自动管理依赖: Maven 可以自动管理依赖项,使用依赖传递,简化了依赖项的管理,使项目构建更加可靠和一致。

3. 确保依赖版本正确性:通过依赖传递的依赖,之间都不会存在版本兼容性问题,确实依赖的版本正确性!

当直接引用或者间接引用出现了相同的jar包! 这时呢,一个项目就会出现相同的重复jar包,这就算作冲突!依赖冲突避免出现重复依赖,并且终止依赖传递!

maven自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择。同时也提供了手动解决的冲突的方式,不过不推荐!

解决依赖冲突(如何选择重复依赖)方式:

 1. 自动选择原则

      - 短路优先原则(第一原则)

          A—>B—>C—>D—>E—>X(version 0.0.1)

          A—>F—>X(version 0.0.2)

         则A依赖于X(version 0.0.2)。

     - 依赖路径长度相同情况下,则“先声明优先”(第二原则)

          A—>E—>X(version 0.0.1)

          A—>F—>X(version 0.0.2)

          在<depencies></depencies>中,先声明的,路径相同,会优先选择!

七、依赖导入失败场景和解决方案

在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:

1. 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。

2.  依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。

3.  本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项,并且也无法重新下载!

解决方案:

1. 检查网络连接和 Maven 仓库服务器状态。

2. 确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。

3. 清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在 lastupdated 缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的 gav 属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!

例如: pom.xml依赖

<dependency>

  <groupId>com.alibaba</groupId>

  <artifactId>druid</artifactId>

  <version>1.2.8</version>

</dependency>

    文件:

    脚本使用:

八、构建概念

项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。

主动触发场景:

- 重新编译 : 编译不充分, 部分文件没有被编译!

- 打包 : 独立部署到外部服务器软件,打包部署

- 部署本地或者私服仓库 : maven工程加入到本地或者私服仓库,供其他工程使用

命令方式构建:

语法: mvn 构建命令  构建命令....

可视化方式构建:

构建命令周期:

构建生命周期可以理解成是一组固定构建命令的有序集合,触发周期后的命令,会自动触发周期前的命令!也是一种简化构建的思路!

- 清理周期:主要是对项目编译生成文件进行清理

    包含命令:clean

- 默认周期:定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分

    包含命令:compile - test - package - install / deploy

- 报告周期

    包含命令:site

    打包: mvn clean package

   本地仓库: mvn clean install

最佳使用方案:

打包: mvn clean package

重新编译: mvn clean compile

本地部署: mvn clean install

周期,命令和插件:

周期→包含若干命令→包含若干插件!

使用周期命令构建,简化构建过程!

最终进行构建的是插件!

插件配置(解决war包版本和JDK版本不兼容的问题):

<build>

   <!-- jdk17 和 war包版本插件不匹配 -->

    <plugins>

        <plugin>

            <groupId>org.apache.maven.plugins</groupId>

            <artifactId>maven-war-plugin</artifactId>

            <version>3.2.2</version>

        </plugin>

    </plugins>

</build>

九、继承与聚合

Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。

继承作用:

作用:在父工程中统一管理项目中的依赖信息,进行统一版本管理!

它的背景是:

对一个比较大型的项目进行了模块拆分。

一个 project 下面,创建了很多个 module。

每一个 module 都需要配置自己的依赖信息。

它背后的需求是:

多个模块要使用同一个框架,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一管理。

使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。

通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。

1、继承语法

父工程:

<groupId>com.atguigu.maven</groupId>

<artifactId>pro03-maven-parent</artifactId>

<version>1.0-SNAPSHOT</version>

<!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->

<packaging>pom</packaging>

子工程:

<!-- 使用parent标签指定当前工程的父工程 -->

<parent>

  <!-- 父工程的坐标 -->

  <groupId>com.atguigu.maven</groupId>

  <artifactId>pro03-maven-parent</artifactId>

  <version>1.0-SNAPSHOT</version>

</parent>



<!-- 子工程的坐标 -->

<!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 -->

<!-- <groupId>com.atguigu.maven</groupId> -->

<artifactId>pro04-maven-module</artifactId>

<!-- <version>1.0-SNAPSHOT</version> -->

2、父工程依赖统一管理

父工程声明版本:

<!-- 使用dependencyManagement标签配置对依赖的管理 -->

<!-- 被管理的依赖并没有真正被引入到工程 -->

<dependencyManagement>

  <dependencies>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-core</artifactId>

      <version>4.0.0.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-beans</artifactId>

      <version>4.0.0.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-context</artifactId>

      <version>4.0.0.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-expression</artifactId>

      <version>4.0.0.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-aop</artifactId>

      <version>4.0.0.RELEASE</version>

    </dependency>

  </dependencies>

</dependencyManagement>

子工程引用版本

<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。  -->

<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->

<!-- 具体来说是由父工程的dependencyManagement来决定。 -->

<dependencies>

  <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-core</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-beans</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-context</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-expression</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-aop</artifactId>

  </dependency>

</dependencies>

3、聚合概念

Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!!

4、聚合作用

1)统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。

2)优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。

5、聚合语法

父项目中包含的子项目列表。

<project>

  <groupId>com.example</groupId>

  <artifactId>parent-project</artifactId>

  <packaging>pom</packaging>

  <version>1.0.0</version>



  <modules>

    <module>child-project1</module>

    <module>child-project2</module>

  </modules>

</project>

6、聚合演示

通过触发父工程构建命令、引发所有子模块构建!产生反应堆!

十、总结

核心点

掌握目标

安装

maven安装、环境变量、maven配置文件修改

工程创建

gavp属性理解、JavaSE/EE工程创建、项目结构

依赖管理

依赖添加、依赖传递、版本提取、导入依赖错误解决

构建管理

构建过程、构建场景、构建周期等

继承和聚合

理解继承和聚合作用、继承语法和实践、聚合语法和实践

以上,maven学习笔记总结

祝好。

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

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

相关文章

开发一款属于自己的校园跑腿小程序 手把手带你写同城跑腿 代取快递 代买东西 代寄快递 含骑手端 管理员端 用户端 校园圈子论坛

今天开始带大家开发一款属于自己的校园跑腿同城跑腿小程序。 第一章讲技术点和效果图&#xff0c;如果你看完效果图觉得不错&#xff0c;可以认真跟着石头哥学习。 第二章教大家如何快速部署项目&#xff0c;如果你只是为了部署源码只需要学习第二章即可。 第三章开始就是带着…

css 输入框动态特效

先上图 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css 输入框动效</title><style>.inputBox {position: relative;width: 250px;}.inputBox input {width: 100%;padding: 10px…

MySQL Connector/J 数据库连接 URL的语法

详情请参考&#xff1a;https://dev.mysql.com/doc/connector-j/en/connector-j-reference-jdbc-url-format.html jdbc:mysql:是用于普通的、基本的故障转移连接使用&#xff1a; jdbc:mysql://[host][,failoverhost...][:port]/[database][?propertyName1][propertyValue1]…

高德地图画渐变线

高德地图画渐变线&#xff0c;思路是将线和颜色均分为多个小线段和小颜色&#xff0c;实现渐变&#xff0c;类似于下图。 如果需要多段线&#xff0c;自己循环拼一下就可以了&#xff0c;方法返回多个小线段组成的polyline数组。 /** 高德地图画渐变线* author: liyun* params…

PHP基础 - 输入输出

在 PHP 中,有多种方法可以用来输出内容。下面是其中的几种: 1、echo: 这是最常见的输出语句之一,可以输出一个或多个字符串。它是一个语言结构,可以省略括号。使用示例如下: <?php // 使用 echo 语句输出一个字符串 echo "Hello, world!\n";// 可以使用…

3.添加与删除字段

添加字段与删除字段 1.添加字段 因为甲方的业务需求是不停变化的&#xff0c;所以在数据库操作中&#xff0c;添加字段可是常有的事。一个完整的字段包括&#xff1a;字段名、数据类型和完整性约束。 语法规则为&#xff1a; ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条…

解决:During handling of the above exception, another exception occurred

解决&#xff1a;During handling of the above exception, another exception occurred 文章目录 解决&#xff1a;During handling of the above exception, another exception occurred背景报错问题报错翻译报错位置代码报错原因解决方法参考内容&#xff1a;今天的分享就到…

用html+css+js做canvas烟花模拟网页动画代码

圣诞节、元旦就要到了&#xff0c;本案例我们将用htmlcssjs做canvas烟花模拟网页动画代码&#xff0c;程序员的浪漫这不就来了嘛&#xff0c;与家人朋友一起看烟花吧&#xff01; 附源码 烟花模拟器 <!-- App --> <div class"container"><div class&…

区块链创新应用场景不断拓展,实现去中心化

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 区块…

gitee配置

注册配置gitee Gitee官网 进入官网之后&#xff0c;有账号直接登录&#xff0c;没有账号注册一个新的账号 下载安装git客户端 官网地址 下载完成&#xff0c;一路直接点击安装直接安装成功 检查是否安装成功 鼠标留在桌面–>右击–>出现Git GUI Here/Git Bash Her…

【LeetCode】每日一题 2023_12_7 出租车的最大盈利(动态规划)

文章目录 刷题前唠嗑题目&#xff1a;出租车的最大盈利题目描述代码与解题思路 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;出租车的最大盈利 题目链接&#xff1a;2008. 出租车的最大盈利 题目描述 代码与解题思路 func …

计算机网络:网络层上(数据平面)

文章目录 前言一、概述1.网络服务模型2.连接建立 二、路由器组成1.路由器结构概况输入端口的功能 2.IP&#xff08;Internet Protocol&#xff09;IPV4IPV6 3.通用转发和SDN 总结 前言 网络层分两部分讲解&#xff0c;本篇文章讲解数据平面的内容&#xff1a;路由器组成、IP协…

麻雀1号开发板开箱

麻雀1号是上海睿赛德电子科技有限公司全新推出的一款高性价比音频Wi-Fi开发板&#xff0c;内置RT-Thread&#xff0c;主打 Wi-Fi、音频和摄像头拍照功能&#xff0c;配合丰富的组件及例程&#xff0c;可降低多媒体应用的开发门槛。 开发板介绍 正面&#xff1a; 背面&#x…

目标检测mAP计算以及coco评价标准

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 讲一下目标检测中的一些常见的指标 在我们使用目标检测网络训练时 最后在验证集上会得到一个coco的评价列表 就像我们图中给的这一系列参数列表一样 我们再进一步引入两个概念 第一个叫做precisi…

DBeaver 如何在没有外网的情况下连接数据库(下载驱动)

1.选择自己要连接的数据库 2.编辑驱动 3.选择你自己通过maven或者别的渠道下载的对应数据库的jar

Python并发-线程和进程

一、线程和进程对应的问题 **1.进程&#xff1a;**CPU密集型也叫计算密集型&#xff0c;指的是系统的硬盘、内存性能相对CPU要好很多&#xff0c;此时&#xff0c;系统运作大部分的状况是CPU Loading 100%&#xff0c;CPU要读/写I/O(硬盘/内存)&#xff0c;I/O在很短的时间就可…

论文阅读《Learning Adaptive Dense Event Stereo from the Image Domain》

论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/html/Cho_Learning_Adaptive_Dense_Event_Stereo_From_the_Image_Domain_CVPR_2023_paper.html 概述 事件相机在低光照条件下可以稳定工作&#xff0c;然而&#xff0c;基于事件相机的立体方法在域迁移时性…

人工麝香市场分析:中国市场年需求量超过15吨

人工麝香作为濒危动物药材麝香的替代品&#xff0c;等同天然麝香配方使用。 是国家重大科研成果和保密品种&#xff0c;用人工麝香生产中成药品种近400种&#xff0c;涵盖中成药常用剂型。 是珍稀动物药材代用品研究的重大突破&#xff0c;为其它珍稀动物药材的应用开辟了一条重…

案例060:基于微信小程序考试系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

深度学习还可以从如下方面进行创新!!

文章目录 一、我认为可以从如下5个方向进行创新总结 一、我认为可以从如下5个方向进行创新 新的模型结构&#xff1a;尽管现在的深度学习模型已经非常强大&#xff0c;但是还有很多未被探索的模型结构。探索新的模型结构可以带来更好的性能和更低的计算成本。 新的优化算法&a…
最新文章