maven笔记

devtools/2025/3/17 1:19:07/

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/devtools/167695.html

相关文章

数学 :矩阵

文章目录 前言1. 基本矩阵运算1.1 矩阵加法1.2 矩阵减法1.3 矩阵乘法 2. 转置矩阵3. 旋转矩阵小结 【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 前言 在许多应用场合下&#xff0c;我们都需要用矩阵来表示公式&#xff0c;接下来简洁描述矩阵…

【初级篇】如何使用DeepSeek和Dify构建高效的企业级智能客服系统

在当今数字化时代,企业面临着日益增长的客户服务需求。使用Dify创建智能客服不仅能够提升客户体验,还能显著提高企业的运营效率。关于DIfy的安装部署,大家可以参考之前的文章: 【入门级篇】Dify安装+DeepSeek模型配置保姆级教程_mindie dify deepseek-CSDN博客 AI智能客服…

【数据库】10分钟学会MySQL的增删改查:数据库、表、表记录操作指南

MySQL作为一种广泛使用的开源关系型数据库管理系统&#xff0c;提供了强大的数据操作功能。增删改查&#xff08;CRUD&#xff09;是数据库操作的核心&#xff0c;涵盖创建&#xff08;Create&#xff09;、读取&#xff08;Read&#xff09;、更新&#xff08;Update&#xff…

解决ubuntu(jetpack)系统下系统盘存储不够的

以下是可以安全清理的内容及操作步骤&#xff0c;按优先级和风险从低到高排序&#xff1a; 1. 清理日志文件&#xff08;低风险&#xff09; /var/log/syslog (7.1G) # 清空syslog文件&#xff08;不删除文件本身&#xff09; sudo truncate -s 0 /var/log/syslog# 或限制sys…

《基于机器学习(xgboost)的人体卡路里消耗预测系统》开题报告

目录 1 选题的背景和意义 1.1 选题的背景 1.2 国内外研究现状及发展趋势 2 研究的基本内容 2.1 基本框架 2.1.1数据输入模块 2.1.2数据预处理模块 2.1.3特征工程模块 2.1.4模型训练与评估模块 2.1.5预测与输出模块 2.1.6用户界面(UI) 2.1.7系统维护与更新模块 2.…

OpnenHarmony 开源鸿蒙北向开发——1.开发环境搭建(DevEco Studio 5.03)

我这边是基于window下对OpenHarmony开源鸿蒙进行北向开发。 一、安装DevEco Studio 1、下载 下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 2、安装 下载完成之后进行解压 双击进行安装 按照我的步骤进行 选择安装目录&#xff0c;全部配置完成后…

Dockerfile Add和Copy的区别。

在 Dockerfile 中&#xff0c;ADD 和 COPY 都用于将文件或目录从构建上下文&#xff08;通常是 Dockerfile 所在的目录&#xff09;复制到 Docker 镜像中&#xff0c;但它们有一些关键区别&#xff1a; 1. COPY 指令 COPY 主要用于复制本地文件或目录到容器的指定路径。 &…

Python函数的递归调用

基本介绍 1、简单的说: 递归就是函数自己调用自己,每次调用时传入不同的值 2、递归有助于编程者解决复杂问题&#xff0c;同时可以让代码变得简洁 递归能解决什么问题&#xff1f; 1、各种数学问题如&#xff1a;皇后问题、汉诺塔、阶乘问题、迷宫问题等等 2、各种算法中也…