maven笔记

embedded/2025/3/16 16:01:00/

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.ppmy.cn/embedded/173101.html

相关文章

在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别

在微信小程序或前端开发中&#xff0c;picker 和 select 都是用户交互中用于选择的组件&#xff0c;但它们在功能、设计和使用场景上有一定的区别。 1. picker 的特点 描述&#xff1a; picker 是微信小程序中的原生组件&#xff0c;通常用于选择单项或多项值&#xff0c;如时…

C++之list类(超详细)

在上一节中我们学习了STL中的vector这个容器&#xff0c;这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…

3. 无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…

Project回调函数qsort②进阶应用

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h>//库函数strcmp头文件 //使用qsort排序结构体 struct Stu { char name[20]; int age; }; //按照年龄排序 int cmp_stu_by_age(const void* e1,const void* e2) { return ((struc…

SpringBoot3实战(从0快速搭建SpringBoot3工程、全局异常处理器、自定义封装结果类、自定义异常)(2025详细教程)(1)

目录 一、博客引言。 &#xff08;1&#xff09;SpringBoot3实战学习篇开篇介绍。 &#xff08;2&#xff09;Vue3实战学习篇回顾介绍。 二、从0快速搭建SpringBoot3工程。(详细步骤) &#xff08;1&#xff09;项目层次结构说明。 &#xff08;2&#xff09;SpringBoot3新工程…

【接口封装】——22、读写文件

解释&#xff1a; 1、封装内容&#xff1a;对不同文件内容的读取->处理->写入 2、文件流写入 3、插入处理函数&#xff1a; if (!replaceJsTxt(tmpFileContent)) return; 函数定义&#xff1a; #include <QMessageBox> #include <QTextStream>void init…

深度解读DeepSeek部署使用安全(48页PPT)(文末有下载方式)

深度解读DeepSeek&#xff1a;部署、使用与安全 详细资料请看本解读文章的最后内容。 引言 DeepSeek作为一款先进的人工智能模型&#xff0c;其部署、使用与安全性是用户最为关注的三大核心问题。本文将从本地化部署、使用方法与技巧、以及安全性三个方面&#xff0c;对Deep…

超精密工件小孔几何尺寸测量:自动化解决方案

下载链接&#xff1a;&#xff08;最新版本&#xff09;超精密工件小孔几何尺寸测量&#xff1a;自动化解决方案python脚本代码&#xff0c;可直接运行&#xff0c;内包含测试数据&#xff0c;亲测好用资源-CSDN文库 在现代制造业中&#xff0c;超精密工件的质量控制至关重要&a…