maven笔记

maven介绍和作用

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

主要作用的理解:

依赖管理:

在编写项目时我们需要许多第三方依赖,有maven后子需要将依赖项的信息编写到Maven工程的配置文件,Maven软件会自动下载并复制这些依赖到项目中,也会自动下载依赖所需要的依赖(确保依赖版本无误)

构建管理:

项目开发后想要将项目打包成.war文件,并部署到服务器中运行;使用maven可以通过一行构建命令(mvn package)快速构建和打包

idea也可以构建项目,为什么要使用maven呢?

原因1:maven构建触发方便

原因2:开发项目的软件有很多,每个软件的项目结构都不相同,使用maven构建可以统一结构

Packaging定义规则:

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

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

  packaging 属性为 war,代表Java的web工程(Java文件,jsp文件,html/cssjs文件,配置文件),打包以后.war结尾的文件。

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

依赖管理

<?xml version="1.0" encoding="UTF-8"?>

<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>4.0.0</modelVersion>

  <!--gavp属性,不会改变-->

  <groupId>com.atguigu</groupId>

  <artifactId>maven-javase-project-02</artifactId>

  <!--构建过程,部署时修改-->

  <version>1.0-SNAPSHOT</version>

  <!--maven工程的打包方式 java jar[默认值]; web war;  不打包 pom-->

  <packaging>war</packaging>

  <!--第三方依赖信息

  dependencies   -项目依赖信息的集合

     dependency   -每个依赖项

        [gav]     -依赖的信息就是其他被打包成maven的工程(该工程被打包成jar

     如何知道第三方依赖的信息呢?

     1 使用官网查询 http://mvnrepository.com

     2 使用插件 maven-search

         点击tools(工具) -maven-search 直接搜索插件即可

    

     扩展:

     1 提取版本号统一管理(自定义一个标签提取版本号到该标签)————————properties<>中设置

     2 可选属性scope——————设置在dependency中(标明依赖可以使用的范围)

         scope————引入依赖的作用

         默认是compile  代表该依赖可以在main中使用,也可以在test中使用,在打包和运行时都有效

         设置为test 该依赖只能在test中使用(例如单元测试方法的依赖)

         设置为runtime  main中不会用,test不会用 在打包和运行时会使用(一般是反射的时候使用)

                             例如:mysql Class.format(com.mysql.cj.jdbc.Driver)

         设置为provided   main中会使用,在test中会使用,在打包和运行时会使用  例如:Servlet      

     总结:scope是一种锦上添花的手段,如果掌握不好,就全部默认值                

        

  -->

  <!--声明版本号-->

  <properties>

    <!--统一管理

    声明一个变量来接收版本号,变量声明以后,在其他位置可以引用 ${jackson.version(变量名)}

    注意:声明的标签建议两层以上命名,推荐 技术名.version

    -->

    <jackson.version>2.18.2</jackson.version>

  </properties>

  <dependencies>

    <dependency>

      <!--定位信息gav三个属性是必须的-->

      <groupId>com.fasterxml.jackson.core</groupId>

      <artifactId>jackson-core</artifactId>

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

      <scope>compile</scope>

    </dependency>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.13.2</version>

      <scope>test</scope>

    </dependency>

  </dependencies>

</project>

依赖传递与依赖冲突

**依赖传递**指的是当一个模块或库 A 依赖于另一个模块或库 B,而 B 又依赖于模块或库 C,那么 A 会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。当我们引入一个库或框架时,构建工具(如 Maven、Gradle)会自动解析和加载其所有的直接和间接依赖,确保这些依赖都可用

           依赖传递:导入依赖会自动导入依赖的依赖!(compile dependenices)

                      简化依赖的导入,确保依赖的版本无冲突

           依赖冲突:发现要导入已经存在的依赖(重复依赖)会终止依赖传递!避免循环依赖和重复依赖问题

           依赖冲突发生场景:重复依赖

           例如

                 A——需要 B 1.0

                 C——需要 B 2.0

            现要导入A与C依赖那么B应该是那个版本

            依赖冲突解决原则:

            第一原则:谁短谁优先(看应用的路径长度)

            A-C-B1.0

            F-B2.0

            那么导入的应该是 A C F B2.0

            第二原则:谁上谁优先(看dependencies声明的先后顺序)

            A-B1.0

            F-B2.0

            那么导入应该是A,F,B1.0

            注意:只要发生冲突了,后续的依赖传递全部终止    

            前提:

                 A 1.1 -> B 1.1 -> C 1.1

                 F 2.2 -> B 2.2

            pom声明:

                       F 2.2

                       A 1.1  

                       B 2.2

             那么会得到F2.2,B2.2,A1.1 (不会引入C1.1,只要发生冲突了,后续的依赖传递全部终止!) 

依赖传递的作用是:---------------------------------自动导入依赖的依赖

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

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

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

依赖冲突-------------------------当发生重复依赖导入会终止依赖传递

maven自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择

依赖下载失败解决方案

解决方案:

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

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

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

 构建管理

构建概念:

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

主动触发场景:

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

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

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

构建步骤

命令方式构建:

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

注意:

1命令执行需要我们进入到项目的根路径

2部署必须时jar包形式

可视化方式构建.

构建命令周期:触发周期后的命令会自动触发同一周期前的命令!

作用:是一种简化触发构建命令过程

是一个有序的构建命令容器

清理周期:clean

构建周期:compile  test  package  install/deploy

报告周期: site

例如:想要打包,就直接package即可,不需要compile  test  package  (因为会自动触发执行compiletest 但不会触发clean ) 故而打包的最佳方案应是mvn clean package

我们执行的是周期命令

继承与聚合

继承特性的理解

继承概念:

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

继承作用

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

    它的背景是:

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

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

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

    它背后的需求是:

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

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

例如:

在一个父工程下不同子工程需要同一个依赖的版本不同;可以在父工程中声明版本,

思路一:直接在父工程中引入依赖<dependenies <denpendency gav(会出现子工程会将不需要的依赖也导入进来)

思路二:父工程引入依赖,只做依赖版本的声明 <dependeniesManagement  <dependenies <denpendency gav(专门为版本管理声明,不会正真导入依赖,只会做一个配置的声明)---------------------------在子工程中导入依赖时就只需要写ga即可不需要再声明版本了

聚合关系实现和作用

1. 聚合概念------------------------------------(统一构建:在父工程中构建就可以触发子工程)

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

2. 聚合作用

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

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

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

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

相关文章

模板-C++提高编程

C的一种编程思想称为泛型编程&#xff0c;用到的技术就是模板 C提供两种模板&#xff1a;函数模板和类模板。 1.函数模板 1.函数模板作用 建立一个通用函数&#xff0c;其返回值类型和形参类型可以用一个虚拟的类型来代替,提高代码复用性&#xff0c;将类型参数化。 2.语法…

基于Asp.net的物流配送管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

顺序表和链表的对比(一)

前言 今天给小伙伴们分享的是在数据结构中顺序表和链表的对比。它们在计算机科学和软件开发中具有广泛的应用&#xff0c;是理解更复杂数据结构&#xff08;如栈、队列、树、图等&#xff09;的基础。这次将会给大家从定义初始化&#xff0c;以及功能增删查改上进行详细对比&a…

星越L_外后视镜使用讲解

目录 1.外后视镜调节 2后视镜折叠 3.后视镜加热 1.外后视镜调节 L控制左边后视镜调节,上下拨动调整视野,一般此镜左右21分,上下55开。 R控制左边后视镜调节,上下拨动调整视野,一般此镜左右13分,上下55开。 2后视镜折叠 车辆解锁自动展开 车辆关闭自动折叠 严寒天气…

DevOps实践:持续集成与持续部署完全指南

文章目录 引言&#xff1a;从人工到自动化的进化革命一、CI/CD核心认知升级1.1 持续集成 vs 持续部署 vs 持续交付1.2 中小团队为什么要实施CI/CD&#xff1f; 二、CI/CD工具链选型指南2.1 中小团队推荐技术栈2.2 工具对比决策矩阵 三、实战五步构建企业级流水线3.1 基础环境搭…

【数据结构】数据结构,算法 概念

0.本篇问题&#xff1a; 数据、数据元素、数据对象、数据项之间的基本关系&#xff1f;ADT是什么&#xff1f;数据结构的三要素&#xff1f;数据的逻辑结构有哪些&#xff1f;数据的存储结构有哪些&#xff1f;算法的五个特征&#xff1f;O(1) O(logn) O(n^n) O(n) O(n^2…

同步Oracle及mysql至KADB的KFS配置文件参考

Oracle源端flysync.ini文件 注意&#xff1a;oracle用户名大写 mysql源端flysync.ini文件 附&#xff1a;目标端KADB的flysync.ini文件 [m_kes_3113] 源端为KES kufl-port3113 datasource-typekingbase rolemaster replication-host10.4.43.53 replication-port54321 …

PECL(Positive Emitter-Coupled Logic)电平详解

一、PECL电平的定义与核心特性 PECL&#xff08;正射极耦合逻辑&#xff09;是一种基于 射极耦合逻辑&#xff08;ECL&#xff09;技术 的高速差分信号标准&#xff0c;采用 正电源供电&#xff08;如5V或3.3V&#xff09;。其核心特性包括 高速传输、低噪声、强抗干扰能力&am…

以 ArcGIS Pro 为笔,绘就水墨地图画卷

一、引言 水墨画&#xff0c;作为中国传统绘画艺术的瑰宝&#xff0c;以其独特的韵味和表现力&#xff0c;在艺术领域占据着重要地位。它通过水与墨的交融&#xff0c;展现出山水之间的灵动与韵味。 而将这种艺术形式与现代地理信息系统&#xff08;GIS&#xff09;技术相结合…

软考网络安全专业

随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;成为社会各界普遍关注的焦点。在这样的背景下&#xff0c;软考网络安全专业应运而生&#xff0c;为培养高素质的网络安全人才提供了有力支撑。本文将对软考网络安全专业进行深入剖析&#xff0c;探讨其在信…

在线 SQL 转 SQLAlchemy:一键生成 Python 数据模型

一款高效的在线 SQL 转 SQLAlchemy 工具&#xff0c;支持自动解析 SQL 语句并生成 Python SQLAlchemy 模型代码&#xff0c;适用于数据库管理、后端开发和 ORM 结构映射。无需手写 SQLAlchemy 模型&#xff0c;一键转换 SQL 结构&#xff0c;提升开发效率&#xff0c;简化数据库…

自定义tiptap插件

本文为开发开源项目的真实开发经历&#xff0c;感兴趣的可以来给我的项目点个star&#xff0c;谢谢啦~ 具体博文介绍&#xff1a; 开源&#xff5c;Documind协同文档&#xff08;接入deepseek-r1、支持实时聊天&#xff09;Documind &#x1f680; 一个支持实时聊天和接入 - 掘…

网络安全需要学多久才能入门?

网络安全是一个复杂且不断发展的领域&#xff0c;想要入行该领域&#xff0c;我们需要付出足够多的时间和精力好好学习相关知识&#xff0c;才可以获得一份不错的工作&#xff0c;那么网络安全需要学多久才能入门?我们通过这篇文章来了解一下。 学习网络安全的入门时间因个人的…

EG82088串口边缘计算网关

EG82088串口边缘计算网关 EG8208是一款专业级8路独立隔离型RS485通讯控制器,通过Modbus及JSON支持、灵活的TCP/IP和UDP切换、内置监控自诊断等特性,广泛应用于工业自动化、楼宇管理等领域,为用户提供卓越的数据采集和设备管理解决方案。 接口类型&#xff1a;8RS485/8DO/1LAN协…

Linux下GCC和C++实现带多组标签的Snowflake SQL查询批量数据导出程序

设计一个基于多个带标签Snowflake SQL语句作为json配置文件的Linux下GCC的C代码程序&#xff0c;实现根据不同的输入参数自动批量地将Snowflake数据库的数据导出为CSV文件到本地目录上&#xff0c;标签加扩展名.csv为导出数据文件名&#xff0c;文件已经存在则覆盖原始文件。需…

Trae AI 辅助修复uniapp 微信小程序的Bug

一、transparent的兼容问题 设计稿&#xff1a; 实际在iphone 6 plu上&#xff1a; 直接让Trae AI修复&#xff1a; 修改后验证通过。 二、v-if分支中子元素根据输入框中内容长度动态添加class样式失效 遇到了个“怪问题”&#xff0c;在其他手机或者开发者工具都正常。也…

conda install 和 pip install 的区别

conda install 和 pip install 是两个常用的包安装命令&#xff0c;但它们在很多方面存在差异。 1. 所属管理系统不同 1.1 conda install conda install 是Anaconda和Miniconda发行版自带的包管理工具 conda 的安装命令。conda 是一个跨平台的开源包管理系统和环境管理系统&…

uni-app App 端分段导出 JSON 数据为文件

在开发过程中&#xff0c;我们经常需要将大量数据导出为 JSON 文件&#xff0c;尤其是在处理长列表或大数据集时。然而&#xff0c;直接将所有数据写入一个文件可能会导致性能问题&#xff0c;尤其是在移动设备上。为了优化性能并提高用户体验&#xff0c;我们可以将数据分段导…

视频推拉流EasyDSS案例分析:互联网直播/点播技术与平台创新应用

随着互联网技术的快速发展&#xff0c;直播/点播平台已成为信息传播和娱乐的重要载体。特别是在电视购物领域&#xff0c;互联网直播/点播平台与技术的应用&#xff0c;不仅为用户带来了全新的购物体验&#xff0c;也为商家提供了更广阔的营销渠道。传统媒体再一次切实感受到了…

MySQL再次基础 向初级工程师迈进

作者&#xff1a;在计算机行业找不到工作的大四失业者 Run run run ! ! ! 1、MySQL概述 1.1数据库相关概念 1.2MySQL数据库 2、SQL 2.1SQL通用语法 SQL语句可以单行或多行书写&#xff0c;以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。MySQL数据库的SQL语句不区…