Meven

目录

  • 1.简介
  • 2.Maven项目目录结构
    • 2.1 约定目录结构的意义
    • 2.2 约定大于配置
  • 3. POM.XML介绍
    • 3.2 依赖引用
    • 3.3 属性管理
  • 4 Maven生命周期
    • 4.1 经常遇到的生命周期
    • 4.1 全部生命周期
  • 5.依赖范围(Scope)
  • 6. 依赖传递
    • 6.1 依赖冲突
    • 6.2 解决依赖冲突
      • 6.2.1 最近依赖者优先
      • 6.2.2 路径近者优先原则
    • 6.3 依赖排除
  • 7. 聚合项目

1.简介

Maven是一个Java项目管理和构建工具,他可以定义项目结构项目依赖,并使用同意的方式进行自动化构建,是Java项目中不可缺少的工具。

2.Maven项目目录结构

该目录结构是事先约定好的!不可随意变更。
在这里插入图片描述
另外还有一个target目录(文件夹)专门用于存放构建操作输出的结果

2.1 约定目录结构的意义

Maven未来让Java项目构建的过程尽可能自动化完成,所以必须约定目录结构的作用。
例如:Maven执行编译操作,必须先去Java源程序目录读取Java源代码,然后执行编译,最后把编译结果存放在Target目录。

2.2 约定大于配置

Maven对于目录结构这个问题,没有采用配置的方法,而是基于约定。这回让我们在开发过程中比较方便。如果在每次创建Maven工程之后,还需要对各个目录的位置进行详细的配置,那肯定非常麻烦。
目前开发领域的技术趋势是:约定大于配置、配置大于编码。

3. POM.XML介绍

了解maven本质上就是了解pom.xml文件夹
一般我们在生成一个maven项目后,基础的pom.xml如下所示:

<?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><!--本项目坐标信息(每个maven项目都会有唯一的坐标)--><!--通过这这三项组成的,通过坐标信息可以定位到具体的Jar包信息--><!--定位过程是仓库->镜像->找不到报错not found--><groupId>com.ztt</groupId> <!-- groupId 组织名称,一般是域名反写--><artifactId>untitled</artifactId> <!-- artifactId 项目名--><version>1.0-SNAPSHOT</version> <!-- version 版本名称--><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>

3.2 依赖引用

本质上就是:如何通过坐标信息引用jar包
maven项目在<dependencies></dependencies> 引入依赖(引入jar包)。

在pom.xml添加servlet的依赖

    <dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency></dependencies>

在这里插入图片描述
这时候这个依赖就已经添加进来了

3.3 属性管理

pom.xml属性管理一般用<properties> </properties> 包裹。
如下所示,同时下面我也介绍了几个常用的属性配置。

<!--属性变量--><properties><!--JDK版本--><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><!--编码--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!--这里也经常用于声明依赖的版本--><javax.servlet.version>3.1.0</javax.servlet.version></properties>

注意properties中经常用于生命依赖的版本,这样做的好处是可以帮助我们进行统一的版本管理
具体操作如下。
在这里插入图片描述

4 Maven生命周期

4.1 经常遇到的生命周期

clean:默认是清除target目录中的所有文件,避免将历史版本打到新的包中造成一些不在预期中的问题。
process-resources:将资源文件src/main/resources下的文件复制到target/classes目录中。
compile:将src/main/java下的代码编译成 class 文件,也放到target/classes目录中。
process-test-resources:将资源文件src/test/resources下的文件复制到target/test-classes目录中。
test-compile:将src/test/java下的代码编译成 class 文件,也放到target/test-classes目录中。
test:运行单元测试并在target/surefire-reports中生成测试报告。
package:将资源文件、class文件、pom文件打包成一个jar/war包。
install:将生成的jar包推送到本地仓库中。
deploy:将生成的jar包推送到远程仓库中。

IDEA中打开Maven控制界面,查看生命周期
在这里插入图片描述

4.1 全部生命周期

在这里插入图片描述

1. Clean Lifecycle - 清理项目
pre-clean: 在清理之前执行的操作。
clean: 删除所有上一次构建生成的文件。

2. Default Lifecycle - 构建项目:
validate: 验证项目是正确的,所有必要的信息都已经准备就绪。
initialize: 初始化构建状态,例如设置属性。
generate-sources: 生成需要包含在编译中的源代码。
process-sources: 处理源代码,例如过滤源代码中的值。
generate-resources: 复制和生成资源文件到指定目录。
process-resources: 处理资源文件,例如替换资源中的占位符。
compile: 编译项目的源代码。
process-classes: 处理编译生成的类文件。
generate-test-sources: 生成测试源代码。
process-test-sources: 处理测试源代码。
generate-test-resources: 复制和生成测试资源文件。
process-test-resources: 处理测试资源文件。
test-compile: 编译测试源代码。
process-test-classes: 处理测试编译生成的类文件。
test: 使用单元测试框架运行测试。
prepare-package: 准备打包操作。
package: 将编译后的代码打包成可分发的格式,如JAR、WAR。
pre-integration-test: 在集成测试之前执行的操作。
integration-test:处理和部署包到可以运行集成测试的环境中。
post-integration-test: 在集成测试之后执行的操作。
verify: 运行任何检查以验证包是有效的。
install: 安装包到本地仓库,使其可以作为其他项目的依赖。
deploy: 将最终的包复制到远程仓库,供其他开发人员和项目使用。

3.Site Lifecycle - 生成项目站点
pre-site: 在生成项目站点之前执行的操作。
site: 生成项目报告和文档。
post-site: 在生成项目站点之后执行的操作。
site-deploy: 将生成的站点部署到服务器上。

5.依赖范围(Scope)

依赖作用范围一般在<scope></scope>中设置
Maven的依赖范围包括:编译、测试、运行\打包(刚入门可以把运行和打包理解成一个)
编译:只在main\java的中有效
测试:只在main\test中有效
运行\打包:项目生成war、jar包时,在运行过程中使用到该依赖。

在这里插入图片描述
作用范围的建议

  1. 所有的Scope都设置成compile也不会影响功能的正常运行,同时90%以上的依赖都会使用compile
  2. 每个依赖会有自己默认的scope,同时maven也会对依赖的scope自动补全,所以建议用官方提供的scope也没毛病。

6. 依赖传递

在Maven中,依赖可以传递的,假设存在三个项目,项目A、项目B、项目C。假设C依赖B,B依赖A,那么我们可以根据Maven项目依赖的特征推断出项目C也依赖项目A。
在这里插入图片描述

6.1 依赖冲突

依赖冲突通常发生在项目中使用了多个库,而这些库又依赖于相同库的不同版本时。这种情况可能导致构建失败或运行时错误,因为Java运行时环境要求所有类库的版本必须一致。下面是一个具体的例子来说明依赖冲突:

假设你正在开发一个Java Web应用程序,并且你的项目有以下依赖关系:

你的项目直接依赖于LibraryA,版本1.0。
LibraryA又依赖于CommonLib,版本1.5。
同时,你的项目还直接依赖于LibraryB,版本2.0。
而LibraryB也依赖于CommonLib,但需要版本2.0。

这里的依赖关系可以表示为:

在这里插入图片描述

在这个例子中,CommonLib的两个不同版本(1.5和2.0)被引入到项目中,这将导致依赖冲突。Maven会尝试根据其依赖解析策略来解决这个冲突,但如果没有明确指定版本,可能会导致以下问题:

  1. 构建失败:Maven可能无法决定使用哪个版本的CommonLib,导致构建失败。
  2. 运行时错误:如果Maven选择了一个版本,但在运行时环境中使用了另一个版本的CommonLib,可能会导致NoClassDefFoundError或ClassNotFoundException等错误。

6.2 解决依赖冲突

6.2.1 最近依赖者优先

Maven的依赖调解原则,通常被称为"最近依赖者优先"或"第一声明者原则"(First Declaration Rule),是Maven处理传递性依赖冲突时使用的一种策略。这个原则确保了依赖冲突可以通过一个简单的规则来解决,从而避免了复杂的版本冲突问题。

第一声明者原则的工作原理:
依赖树的构建:Maven首先构建项目的依赖树,包括直接依赖和所有间接依赖。

冲突检测:在构建依赖树的过程中,Maven会检测到多个依赖项可能依赖于同一个库的不同版本。

选择依赖版本:当检测到版本冲突时,Maven会选择依赖树中距离项目最近的依赖项指定的版本。换句话说,它会选择第一个声明该库依赖的依赖项的版本。

忽略后续声明:在依赖树中,任何后续声明的相同库的不同版本将被忽略,即使它们可能是更新的或更低的版本。

6.2.2 路径近者优先原则

路径近者优先原则(Shortest Path Rule)是Maven处理依赖冲突时使用的另一种策略,它与第一声明者原则有相似之处,但更侧重于依赖路径的长度。这个原则确保了在多个依赖项指向同一个库的不同版本时,Maven选择路径最短的依赖版本。

路径近者优先原则的工作原理:
依赖树构建:Maven构建项目的依赖树,包括直接依赖和间接依赖。

冲突检测:在构建依赖树的过程中,Maven检测到多个依赖项可能依赖于同一个库的不同版本。

最短路径选择:当检测到版本冲突时,Maven会选择依赖路径最短的依赖项指定的版本。依赖路径是指从项目到依赖项的直接距离。

忽略长路径声明:即使长路径上的依赖项声明了更新或更低的版本,Maven也会忽略它,因为根据路径近者优先原则,它不是最优选择。

6.3 依赖排除

依赖排除是Maven处理依赖冲突的一种常用方法。以下是如何进行依赖排除的一个具体例子:

假设你的项目直接依赖于两个库:LibraryA 和 LibraryB。但是,LibraryA 和 LibraryB 都间接依赖于同一个库 CommonLib,并且它们依赖的 CommonLib 版本不同。为了解决这个冲突,你可以选择排除一个版本的 CommonLib,并显式地声明你需要的版本作为直接依赖。

以下是pom.xml文件中的依赖配置示例:

<dependencies><!-- 直接依赖LibraryA --><dependency><groupId>com.example</groupId><artifactId>LibraryA</artifactId><version>1.0</version><!-- 排除LibraryA中对CommonLib 1.5的依赖 --><exclusions><exclusion><groupId>com.common</groupId><artifactId>CommonLib</artifactId></exclusion></exclusions></dependency><!-- 直接依赖LibraryB --><dependency><groupId>com.example</groupId><artifactId>LibraryB</artifactId><version>2.0</version><!-- 排除LibraryB中对CommonLib 2.0的依赖 --><exclusions><exclusion><groupId>com.common</groupId><artifactId>CommonLib</artifactId></exclusion></exclusions></dependency><!-- 显式声明CommonLib的版本,确保使用一致的版本 --><dependency><groupId>com.common</groupId><artifactId>CommonLib</artifactId><version>1.5</version> <!-- 假设我们决定使用1.5版本 --></dependency></dependencies><!-- ... 其他配置 ... -->

在这个例子中,我们首先排除了 LibraryA 和 LibraryB 中对 CommonLib 的依赖。然后,我们添加了一个直接依赖项,指定了 CommonLib 的版本为1.5。这样,无论 LibraryA 和 LibraryB 依赖的是 CommonLib 的哪个版本,Maven都会使用我们显式声明的版本1.5。

通过这种方式,你可以控制项目中使用的依赖项的版本,避免由于依赖传递带来的版本冲突问题。

7. 聚合项目

Maven聚合项目(也称为多模块项目或父项目)是一种项目组织方式,它允许你将一个大项目分解成多个小的、可管理的模块。每个模块可以独立构建和维护,同时仍然可以作为一个整体来构建和分发。

对于项目开发,聚合项目有以下好处
模块化:将一个大项目分解成多个模块,有助于更好地组织代码,每个模块负责特定的功能或组件。
重用性:模块化使得代码可以在不同项目中重用,因为它们可以作为独立的组件进行构建和部署。
并行开发:在多模块项目中,不同的团队可以同时在不同的模块上工作,这有助于提高开发效率和加快开发速度。
依赖管理:父项目可以使用部分来统一管理所有子模块的依赖版本,确保依赖的一致性。

作为聚合项目,其父项目应该

  1. 删除src,聚合项目的父项目不承担代码,只是作为子项目的管理
  2. <packaging></packaging> 一般为jar或者war,但是作为父项目,其不是一个具体的包,固其中pom.xml中的应进行<packaging>pom</packaging>设置。
  3. 利用pom.xml中的 <modules> </modules>管理子工程

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

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

相关文章

鸿蒙项目实战-月木学途:1.编写首页,包括搜索栏、轮播图、宫格

效果展示 搜索栏制作 相关知识回顾 输入框组件TextInput 单行输入框类型.type(InputType.Normal)//基本输入框.type(InputType.Password)//密码.type(InputType.Email)//邮箱.type(InputType.Number)//数字.type(InputType.PhoneNumber)//电话号.type(InputType.Normal).type…

地图初始化-多视图几何基础

在ORB-SLAM2中初始化和使用的传感器类型有关&#xff0c;其中单目相机模式初始化相对复杂&#xff0c;需要运行一段时间才能成功初始化。而双目相机、 RGB-D相机模式下比较简单&#xff0c;一般从第一帧开始就可以完成初始化。 为什么不同传感器类型初始化差别这么大呢&#x…

spring-security安全框架(超精细版附带流程讲解图)

目录 一、回顾一下 二、security使用 2.1 覆盖掉默认配置「自定义配置」 2.2 如何自定义认证 2.3 纯纯自定义 2.4 jwt 2.5 官网认证流程 2.6 RBAC模型 4.1. 创建表结构 2.7 如何实现权限流程 一、回顾一下 security干啥的? 认证和授权 使用方式 引入依赖, 基于spri…

算法力扣刷题 二十五【28.找出字符串中第一个匹配项的下标】

前言 字符串篇&#xff0c;继续。 记录 二十五【28.找出字符串中第一个匹配项的下标】 一、题目阅读 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不…

C语言中的基础指针操作

在C语言中&#xff0c;指针是一个非常重要的概念&#xff0c;它提供了直接访问内存地址的能力。指针变量用于存储内存地址&#xff0c;而不是数据值&#xff0c;在某种意义上和门牌号具有相似含义&#xff1a;指针是一个变量&#xff0c;其存储的是另一个变量的内存地址&#x…

java之动态代理

1 代理模式 代理模式提供了对目标对象额外的访问方式&#xff0c;即通过代理对象访问目标对象&#xff0c;这样可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。简言之&#xff0c;代理模式就是设置一个中间代理来控制访问原目标…

网络io与select,poll,epoll

前言 网络 IO&#xff0c;会涉及到两个系统对象&#xff0c;一个是用户空间调用 IO 的进程或者线程&#xff0c;另一个是内核空间的内核系统&#xff0c;比如发生 IO 操作 read 时&#xff0c;它会经历两个阶段&#xff1a; 1. 等待数据准备就绪 2. 将数据从内核拷贝到进程或…

网络编程常见问题

1、TCP状态迁移图 2、TCP三次握手过程 2.1、握手流程 1、TCP服务器进程先创建传输控制块TCB&#xff0c;时刻准备接受客户进程的连接请求&#xff0c;此时服务器就进入了LISTEN&#xff08;监听&#xff09;状态&#xff1b; 2、TCP客户进程也是先创建传输控制块TCB&#xff…

改进经验模态分解方法-通过迭代方式(IMF振幅加权频率,Python)

一种新颖的改进经验模态分解方法-通过迭代方式&#xff08;IMF振幅加权频率&#xff09;有效缓解了模态混叠缺陷&#xff0c;以后慢慢讲&#xff0c;先占坑。 import numpy as np import matplotlib.pyplot as plt import os import seaborn as sns from scipy import stats i…

C语言图书管理系统控制台程序

程序示例精选 C语言图书管理系统控制台程序 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《C语言图书管理系统控制台程序》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读…

加密与安全_三种方式实现基于国密非对称加密算法的加解密和签名验签

文章目录 国际算法基础概念常见的加密算法及分类签名和验签基础概念常见的签名算法应用场景 国密算法对称加密&#xff08;DES/AES⇒SM4&#xff09;非对称加密&#xff08;RSA/ECC⇒SM2&#xff09;散列(摘要/哈希)算法&#xff08;MD5/SHA⇒SM3&#xff09; Code方式一 使用B…

智慧园区综合平台解决方案PPT(75页)

## 智慧园区的理解 ### 从园区1.0到园区4.0的演进 1. 园区1.0&#xff1a;以土地经营为主&#xff0c;成本驱动&#xff0c;提供基本服务。 2. 园区2.0&#xff1a;服务驱动&#xff0c;关注企业成长&#xff0c;提供增值服务。 3. 园区3.0&#xff1a;智慧型园区&#xff…

机器学习引领教育革命:智能教育的新时代

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f4d2;1. 引言&#x1f4d9;2. 机器学习在教育中的应用&#x1f31e;个性化学习&#x1f319;评估与反馈的智能化⭐教学资源的优…

STC89C52RC单片机设计的FM收音机+自动搜台+存储电台(程序+原理图+PCB)

资料下载地址&#xff1a;STC89C52RC单片机设计的FM收音机自动搜台存储电台&#xff08;程序原理图PCB) 1、实物图 2、部分程序 #include <reg52.h> #include "tea5767.h" #include "delay.h" #include "lcd1602.h" //K1:上一台 K2:下一…

mac电脑游戏推荐:NBA 2K24 街机版下载

NBA 2K24 街机版是一款由2K Sports开发并发行的篮球游戏&#xff0c;属于著名的NBA 2K系列。这款游戏为玩家提供了与NBA联赛中真实球员和球队互动的机会&#xff0c;体验篮球比赛的激情与紧张。街机版的NBA 2K24通常会在游戏厅、商场等公共场所设置&#xff0c;供玩家投币游玩。…

c++重载(运算符)

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 对于系统的所有操作符&#xff0c;一般情况下&#xff0c;只支持基本数…

AWTK 用 icon_at 属性设置图标位置

1. style 在 style 文件中通过 icon_at 属性设置图标位置。 <style name"right_bottom" icon_at"right_bottom"><normal icon"unchecked_right_bottom" /><pressed icon"unchecked_right_bottom" /><over i…

redis实战-短信登录

基于session的登录流程 session的登录流程图 1. 发送验证码 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff0c;如果不合法&#xff0c;则要求用户重新输入手机号 如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行保存&#x…

第一节:如何开发第一个spring boot3.x项目(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;从今天开始&#xff0c;我会记录每篇我自学spring boot3.x的经验。只要我不偷懒&#xff0c;学完应该很快&#xff0c;哈哈&#xff0c;更新速度尽可能快&#xff0c;想和大佬们一块讨论&#xff0c;如果需要讨论的欢迎一起评论区留…

Pytorch实战(二)

文章目录 前言一、LeNet5原理1.1LeNet5网络结构1.2LeNet网络参数1.3LeNet5网络总结 二、AlexNext2.1AlexNet网络结构2.2AlexNet网络参数2.3Dropout操作2.4PCA图像增强2.5LRN正则化2.6AlexNet总结 三、实战3.1LeNet5模型搭建3.2模型训练 前言 参考原视频&#xff1a;哔哩哔哩。 …