Maven配置及使用

1. Maven简介和安装

1.1. Maven是一个依赖管理工具

  • 问题:
    1. jar包的规模
      随着使用框架越来越多,或框架的封装程度越来越高,项目中使用的jar包也越来越多。项目中,一个模块里用到上百个jar包是非常正常的
    2. jar包的来源
      • jar包所属技术官网
      • 第三方下载网站
      • 使用maven后,依赖对应的jar包能够自动下载,方便、快捷、规范
    3. jar包的导入问题
      在web工程中,jar包必须存放在指定位置
      使用maven之后,通过配置依赖的坐标,查找本地仓库中相应jar包,若本地仓库没有,统一从镜像网站或中央仓库中下载
    4. jar包之间的依赖
      框架中使用的jar包,不仅数量庞大,而且彼此之间存在错综复杂的依赖关系,而且jar包之间可能产生冲突;使用maven几乎不需要管理这些关系,只需要调整极个别的地方,极大减轻了我们的工作量。

1.2. Maven介绍

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

Maven的工作原理模型图
在这里插入图片描述

1.3. 安装和配置

https://maven.apache.org/docs/history.html
各个工具选用版本:

工具版本
Maven3.8.8
JDK17
Tomcat10

1.3.1. Maven功能配置

需要修改maven/conf/settings.xml配置文件,修改maven的一些默认配置。我们主要修改的配置:

  1. 依赖本地缓存位置(本地仓库位置)
<!-- conf/settings.xml --><localRepository>D:\maven-repository</localRepository>
  1. maven下载镜像
<!--配置国内阿里镜像-->
<!--在mirrors节点(标签)下添加中央仓库镜像-->
<mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>
</mirror>
  • maven选用编译项目的jdk版本
<!--在profiles节点(标签)下添加jdk编译版本-->
<profile><id>jdk-17</id><activation><activeByDefault>true</activeByDefault><jdk>17</jdk></activation><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><maven.compiler.compilerVersion>17</maven.compiler.compilerVersion></properties>
</profile>

1.4. 基于IDEA创建Maven工程

Maven工程相对之前的项目,多出一组gavp属性: GroupId、ArtifactId、Version、Packaging,其中前三个是必要的,Packaging 属性为可选项

  • Packaging定义规则:指示将项目打包为什么类型的文件,idea根据packaging值,识别maven项目类型

    • jar(默认值):普通的Java工程,打包以后是.jar结尾的文件。
    • war:代表Java的web工程,打包以后.war结尾的文件。
    • pom:不会打包,用来做继承的父工程。

1.4.1. Maven工程项目结构说明

|-- pom.xml                               # Maven 项目管理文件,用于描述项目的依赖和构建配置等信息。
|-- src|-- main                              # 项目主要代码|   |-- java                          # Java 源代码目录|   |   `-- com/example/myapp         # 开发者代码主目录|   |       |-- controller            # 存放 Controller 层代码的目录|   |       |-- service               # 存放 Service 层代码的目录|   |       |-- dao                   # 存放 DAO 层代码的目录|   |       `-- model                 # 存放数据模型的目录|   |-- resources                     # 资源目录,存放配置文件、静态资源等|   |   |-- log4j.properties          # 日志配置文件|   |   |-- spring-mybatis.xml        # Spring Mybatis 配置文件|   |   `-- static                    # 存放静态资源的目录|   |       |-- css                   # 存放 CSS 文件的目录|   |       |-- js                    # 存放 JavaScript 文件的目录|   |       `-- images                # 存放图片资源的目录|   `-- webapp                        # 存放 WEB 相关配置和资源|       |-- WEB-INF                   # 存放 WEB 应用配置文件|       |   |-- web.xml               # Web 应用的部署描述文件|       |   `-- classes               # 存放编译后的 class 文件|       `-- index.html                # Web 应用入口页面`-- test                              # 项目测试代码|-- java                          # 单元测试目录`-- resources                     # 测试资源目录

1.5. Maven构建项目

  1. 命令方式构建
命令描述
mvn compile编译项目,生成target文件
mvn package打包项目,生成jar或war文件
mvn clean清理编译或打包后的项目结构
mvn install打包后上传到maven本地仓库
mvn deploy只打包,上传到maven私服仓库
mvn site生成站点
mvn test执行测试源码

如果war包打包插件和jdk版本不匹配:pom.xml 添加以下代码即可

<build><!-- jdk17 和 war包版本插件不匹配 --><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin></plugins>
</build>
  1. idea可视化方式构建
    在这里插入图片描述

2. Maven依赖管理

通过定义POM文件,Maven能够自动解析项目的依赖关系,并通过Maven仓库自动下载和管理依赖

2.1. 核心信息配置(GAVP)

<!-- 模型版本 -->
<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-->
<packaging>jar/pom/war</packaging>

2.2. 依赖管理配置

  1. 依赖管理和添加
<!-- 通过编写依赖jar包的gav必要属性,引入第三方依赖!scope属性是可选的,可以指定依赖生效范围!依赖信息查询方式:1. maven仓库信息官网 https://mvnrepository.com/2. mavensearch插件搜索-->
<dependencies><!-- 引入具体的依赖包 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version><!-- 依赖范围 --><scope>runtime</scope></dependency>
</dependencies>
  1. 依赖版本统一提取和维护
<!--声明版本-->
<properties><!--命名随便,内部制定版本号即可!--><junit.version>4.12</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>

2.3. 依赖范围

依赖范围描述
compile编译依赖范围。对于三种 classpath 均有效。例如,log4j 在编译、测试、运行过程都是必须的。
test测试依赖范围。只对测试 classpath 有效。例如,Junit 依赖只有在测试阶段才需要。
provided已提供依赖范围。只对编译 classpath 和测试 classpath 有效。例如,servlet-api 依赖对于编译、测试阶段而言是需要的,但是运行阶段,由于外部容器已经提供,故不需要 Maven 重复引入该依赖。
runtime运行时依赖范围。只对测试 classpath、运行 classpath 有效。例如,JDBC 驱动实现依赖,其在编译时只需 JDK 提供的 JDBC 接口即可,只有测试、运行阶段才需要实现了 JDBC 接口的驱动。

2.4. Build构建配置

默认情况下,构建不需要额外配置。也可以在pom.xml定制一些配置,来修改默认构建的行为和产物

  1. 指定打包命名
<!-- 默认的打包名称:artifactid+verson.打包方式 -->
<build><finalName>定义打包名称</finalName>
</build>  
  1. 指定打包文件
    应用场景:mybatis中有时会将用于编写SQL语句的映射文件和mapper接口都写在src/main/java下的某个包中,此时映射文件就不会被打包
<build><!--设置要打包的资源位置--><resources><resource><!--设置资源所在目录--><directory>src/main/java</directory><includes><!--设置包含的资源类型--><include>**/*.xml</include></includes></resource></resources>
</build>
  1. 配置依赖插件
<build><plugins><!-- java编译插件,配jdk的编译版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><!-- tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8090</port><path>/</path><uriEncoding>UTF-8</uriEncoding><server>tomcat7</server></configuration></plugin></plugins>
</build>

3. Maven依赖传递和依赖冲突

3.1. Maven依赖传递特性

依赖的传递性:假如有Maven项目A、B、C,B依赖A,C依赖B。那么我们可以说 C依赖A。依赖关系为:C—>B—>A, 执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中,这就是依赖的传递性

  • 传递的原则
    • B 依赖 C 时使用 compile 范围:可以传递
    • B 依赖 C 时使用 test 或 provided 范围:不能传递。
    • B 依赖 C 时,若配置了以下标签,则不能传递
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.15</version><optional>true</optional>
</dependency>

3.2. Maven依赖冲突特性

当直接或间接引用出现相同的jar包,一个项目就会出现相同的重复jar包,就是依赖冲突。依赖冲突避免出现重复依赖,并且终止依赖传递。
在这里插入图片描述

  • 解决依赖冲突的方式
    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>中,先声明的,路径相同,会优先选择
    1. 手动排除
<dependency><groupId>com.wyb.maven</groupId><artifactId>pro01-maven-java</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope><!-- 使用excludes标签配置依赖的排除  --><exclusions><!-- 在exclude标签中配置一个具体的排除 --><exclusion><!-- 指定要排除的依赖的坐标(不需要写version) --><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions>
</dependency>

4. Maven工程继承和聚合关系

4.1. Maven工程继承关系

  • 继承:在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以在多个项目中共享同一配置信息,简化项目的管理和维护工作。
  • 继承作用:在父工程中统一管理项目中的依赖信息。
    • 背景
      • 对一个比较大型的项目进行模块拆分。
      • 一个 project 下面,创建了很多个 module。
      • 每一个 module 都需要配置自己的依赖信息。

4.1.1. 继承语法

  1. 父工程
<groupId>com.wyb.maven</groupId><artifactId>pro03-maven-parent</artifactId><version>1.0-SNAPSHOT</version><!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom --><packaging>pom</packaging>
  1. 子工程
<!-- 使用parent标签指定当前工程的父工程 -->
<parent><!-- 父工程的坐标 --><groupId>com.wyb.maven</groupId><artifactId>pro03-maven-parent</artifactId><version>1.0-SNAPSHOT</version>
</parent><!-- 子工程的坐标 -->
<!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 -->
<!-- <groupId>com.wyb.maven</groupId> -->
<artifactId>pro04-maven-module</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->
  1. 父工程依赖统一管理
    父工程声明版本
<!-- 使用dependencyManagement标签配置对依赖的管理 -->
<!-- 被管理的依赖并没有真正被引入到工程 -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>6.0.10</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>
</dependencies>

4.2. Maven工程聚合关系

  • 聚合:将多个项目组织到一个父级项目中,以便一起构建和管理的机制。聚合可以帮助我们更好地管理一组相关的子项目,同时简化它们的构建和部署过程。
  • 聚合作用:
    1. 管理多个子项目:将多个子项目组织在一起,方便管理和维护。
    2. 构建和发布一组相关的项目:在一个命令中构建和发布多个相关的项目,简化了部署和维护工作。
    3. 优化构建顺序:对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
    4. 统一管理依赖项:在父项目中管理公共依赖项和插件,避免重复定义。
  • 聚合语法
    父项目中包含的子项目列表
<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>

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 面试经典150题 201.数字范围按位与

题目&#xff1a;给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 提示&#xff1a;0 < left < right < 2^31 - 1 思路&#xff1a; 位与的特性…

《一本书讲透Elasticsearch》读书笔记(二)

Elasticsearch集群部署 Elastic Stack集群部署基础知识 Elasticsearch、Logstash、Beats、Kibana全部都支持跨平台部署 集群部署平台及操作系统的选型 可供选择的部署平台包括实体服务器、虚拟机&#xff08;VMWare、OpenStack等&#xff09;​、容器化平台&#xff08;Doc…

链式队列操作

文章目录 &#x1f34a;自我介绍&#x1f34a;概述&#x1f34a;链式队列代码linkstack.clinkstack.hmain.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&…

课程表-LeetCode100

现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示在选修课程 ai 前 必须 先选修 bi 。 例如&#xff0c;想要学习课程 0 &#xff0c;你需要先完成课程 1…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-23

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-23 本期&#xff0c;我们对大语言模型在表情推荐, 软件安全和 自动化软件漏洞检测等方面如何应用&#xff0c;提供几篇最新的参考文章。 1 Semantics Preserving Emoji Recommendation with Large Language Mod…

机器学习中分类问题的各类评估指标总结

机器学习中分类问题的各类评估指标总结 在机器学习的世界里&#xff0c;分类问题占据了半壁江山。从垃圾邮件检测到疾病诊断&#xff0c;从用户行为分析到市场趋势预测&#xff0c;分类算法的应用无处不在。然而&#xff0c;如何评价一个分类模型的性能&#xff0c;却是一门大…

MovieLife 电影生活

MovieLife 电影生活 今天看到一个很有意思的项目&#xff1a;https://www.lampysecurity.com/post/the-infinite-audio-book “我有一个看似愚蠢的想法。通常&#xff0c;这类想法只是一闪而过&#xff0c;很少会付诸实践。但这次有所不同。假如你的生活是一部电影&#xff0c…

Stable Diffusion 使用详解(13)--- 3D纹理增强

目录 背景 Normal Map 描述 原理 使用心得 例子 描述 原图 参数设置 底模 ​编辑 正负相关性提示词 其他参数 controlnet 效果 还能做点啥 调整 效果 背景 实际上&#xff0c;在stable diffusion 中&#xff0c;你获取发现很多controlnet 其实功能有点类似&…

webview2加载本地页面

加载方式 通过导航到文件 URL 加载本地内容 使用方式&#xff1a; webView->Navigate( L"file:///C:/Users/username/Documents/GitHub/Demos/demo-to-do/index.html"); 但是这种方式存在一些问题&#xff0c;比如&#xff1a; 存在跨域问题&#xff08;我加载…

Java语言程序设计基础篇_编程练习题***18.33 (游戏:骑士旅途的动画)

目录 ***18.33 (游戏:骑士旅途的动画) 习题思路 代码示例 动画演示 ***18.33 (游戏:骑士旅途的动画) 为骑士旅途的问题编写一个程序&#xff0c;该程序应该允许用户将骑士放到任何一个起始正方形&#xff0c;并单击Solve按钮&#xff0c;用动画展示骑士沿着路径的移动&…

9.5HSV体系进行颜色分割

基本概念 inRange() 函数是 OpenCV 中用于图像处理的一个非常有用的函数&#xff0c;即从图像中提取出介于指定范围内的像素值。这个函数在图像处理中特别有用&#xff0c;比如颜色检测、背景去除等应用。它主要用于图像的阈值处理&#xff0c;但与其他阈值方法&#xff08;如…

前端——浮动+定位样式

一、浮动float——浮动是会使盒子脱离文档流 添加了浮动的元素 1.原本的位置不占用 脱离文档流 2.设置了浮动 就不支持auto自适应居中 3.文字会感受到浮动 跟着进行文字环绕效果 而不是浮动元素覆盖文字 文字和浮动处于同一层的关系 4.可以使行内元素支持 高…

苍穹外卖——day3

1.公共字段自动填充 我们在添加功能的时候常常要重复执行一些重复的操作 如下图 我们在执行update或者insert数据库操作的时候&#xff0c;总是要给下面的一些属性赋值 这样如果代码功能一多&#xff0c;这会显得代码很冗长 所以我们引入了公共字段自动填充这个功能的实现…

从入门到精通:SQL 100个关键技术关键词

无论你是刚刚接触数据库管理的新手&#xff0c;还是希望提升技能水平的数据分析师&#xff0c;掌握SQL都是至关重要的一步。SQL是一种强大的工具&#xff0c;用于管理和操作关系型数据库。从简单的数据检索到复杂的事务处理&#xff0c;SQL提供了广泛的功能来满足各种需求。为了…

软件设计师:01计算机组成与结构

文章目录 一、校验码1.奇偶校验码2.海明码3.循环冗余检验码 二、原码反码补码移码三、浮点数表示法1.浮点数相加时 四、寻址方式五、CPU1.访问速度2.cpu的组成 六、RISC和CISC&#xff08;<font color red>只用记住不同就可以&#xff09;七、冗余技术1.结构冗余2.信息冗…

unix中的vfork函数

一、前言 本文介绍unix中的vfork函数&#xff0c;vfork函数功能和fork函数类似&#xff0c;也是用于创建新的进程&#xff0c;只不过调用vfork函数创建的子进程将共享父进程的进程空间&#xff0c;且只有当子进程调用exec()或者exit()函数后&#xff0c;父进程才会继续运行。 …

统信服务器操作系统【Cron定时任务服务】

Cron定时任务服务服务介绍、服务管理、服务配置 文章目录 一、功能概述二、功能介绍1. Cron 服务管理2.Cron 服务管理3.Cron 服务配置run-parts一、功能概述 cron是一个可以用来根据时间、日期、月份、星期的组合来 调度对周期性任务执行的守护进程。利用 cron 所提供的功能,可…

苹果电脑系统重磅更新——macOS Sequoia 15 系统 新功能一 览

有了 macoS Sequoia&#xff0c;你的工作效率将再次提升&#xff1a;快速调整桌面布局&#xff0c;一目了然地浏览网页重点&#xff0c;还可以通过无线镜像功能操控你的iPhone。 下面就来看看几项出色新功能&#xff0c;还有能够全面发挥这些功能的 App 和游戏。 macOS Sequo…

Vue 中 watch 的使用方法及注意事项

前言 Vue 的 Watch 是一个非常有用的功能&#xff0c;它能够监听 Vue 实例数据的变化并执行相应的操作。本篇文章将详细介绍 Vue Watch 的使用方法和注意事项&#xff0c;让你能够充分利用 Watch 来解决 Vue 开发中的各种问题。 1. Watch 是什么&#xff1f; 1.1 Watch 的作…

NVIDIA发布端到端自动驾驶框架Hydra-MDP

自动驾驶是目前人工智能领域的一个主要分支&#xff0c;目前特斯拉的FSD确实是为数不多的大模型框架。与其说特斯拉是一个造车公司&#xff0c;不如说是一个人工智能大数据公司。特斯拉每天靠行驶在道路上的汽车搜集的道路数据不胜其数&#xff0c;而拥有海量的数据是人工智能领…