[Java]maven从入门到进阶

介绍

apache旗下的开源项目,用于管理和构建java项目的工具

官网: Welcome to The Apache Software Foundation!

1.依赖管理

通过简单的配置, 就可以方便的管理项目依赖的资源(jar包), 避免版本冲突问题

优势: 基于项目对象模型(POM),通过一小段描述信息来管理项目的构建

2.统一目录结构

提供标准, 统一的项目结构

3.项目构建

标准跨平台(linux/windows/MacOs)的自动化项目构建方式

POM

仓库

用来管理和存储jar包

1.本地仓库

  1. 本机的仓库, 计算机上的一个目录
  2. 项目中使用的依赖会先在本地仓库中查找

2.远程仓库

  1. 公司/团队维护的仓库
  2. 需要配置,不配置就直连中央仓库
  3. 下载流程
  • 本地仓库中不存在的依赖再来远程仓库查找
  • 依赖存在直接下载使用
  • 依赖不存在去中央仓库下载
  1. 好处
  • 连接中央的仓库的速度较慢, 因为要访问外网
  • 使用中央仓库可以方便其他同事复用依赖
  • 提高团队整体的依赖下载速度

3.中央仓库

官方维护的仓库

依赖查找循序: 本地仓库->远程仓库(私服)->中央仓库

下载

安装

单独安装Maven, Maven的安装包是一个绿色软件, 解压即可使用

说明:

  1. 测试: nvm -v

目录

  1. bin-> 可执行的程序
  2. conf/settings -> 配置文件
  3. mvn_pepo -> 本地仓库
  4. lib -> maven依赖的jar包资源

集成Maven

IEDA中集成Maven有两种方式, 可以配置当前项目, 比较繁琐, 也可以全局配置Maren, 比较推荐

1.当前项目

  1. 选择IDEA中的File -> Settings -> Build, Execution, Deployment -> Build Tools -> Mwven
  2. 设置IEAC使用本地安装的Maven, 并修改配置文件以及本地仓库路径

2.全局配置

使用

创建Maven项目

1.先创建空项目

2.创建模块,选择Maven,选择JDK,点击Next

3.填写模块名称,坐标信息,点击finish,创建完成

目录结构

1.基本信息

项目基本信息存放在pom.xml配置文件中

<!-- 项目坐标 -->
<groupId>itheima.com</groupId>
<artifactId>maven_helloworld</artifactId>
<version>1.0-SNAPSHOT</version><!-- 项目运行和打包的jdk版本   -->
<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

2.Maven坐标

Maven中的坐标是资源的唯一标识, 通过坐标可以定位资源位置

作用: 使用坐标来定义项目或引入项目的依赖

组成:

groupld: 定义当前项目隶属的组织名称, 一般为域名倒写

artifactId: 定义当前Maven项目名称, 一般是模块名称

version: 定义当前项目版本号

3.src根目录

  1. main: 项目资源
  • java: 源代码
  • resources: 配置文件
  1. test: 测试资源
  • java: 源代码
  • resources: 配置文件(使用较少,默认不创建)
  1. target: 编译后的字节码文件

4.HelloWord

1.连包带类创键文件

2.helloworld代码

导入Maven项目

方式1

展开右侧Maven面板->选择+号 ->选择到pom.xml文件 ->导入

方式2

通过IDEA导入Maven项目, 注意要选到 pom.xml 文件

移除Maven项目

这里的移除只是在IDEA中移除maven模块, 资源还存在于文件夹中

依赖管理

依赖配置

依赖: 当前项目运行所需要的jar包, 一个项目可以引入很多依赖

  1. 编写<dependencies></dependencies>标签
  2. 嵌套<dependency></dependency>标签
  3. 定义依赖坐标
<dependencies><dependency>//组织名<groupId>junit</groupId>  //模块名<artifactId>junit</artifactId> //版本号<version>4.12</version>  </dependency>
</dependencies>
  1. 坐标信息查询: https://mvnrepository.com/
  2. 添加坐标后,不会立即生效, 点击刷新的按钮即可 (如果没有刷新按钮可以手动刷新)

  1. 查看依赖以及依赖版本

  1. 如果引入的依赖, 本地仓库不存在, 将会连接远程仓库/中央仓库下载, 这个过程比较耗时

依赖传递

Maven项目中的依赖具有传递性, 项目中配置的依赖是直接依赖, 项目依赖的依赖就是间接依赖

查看依赖关系

方法1: 通过maven面板查看

方法2: 打开pom.xml文件, 右键选择Diagrams -> show Dependencies

排除依赖

A依赖B, B依赖C, 默认A就会依赖C, 不想让A依赖C, 就可以使用依赖排除, 主动断开依赖的资源, 被排除的资源无需指定版本

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!--依赖排除--><exclusions><exclusion><groupId>junit</groupId><artifactId>junit</artifactId></exclusion><!--依赖排除--></exclusions>
</dependency>

依赖范围

依赖的jar包, 默认情况下, 在任何地方都可以使用, 可以通过<scoped></scoped>标签设置其作用范围

  <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>text</scope></dependency>

可选参数

生命周期

Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一

分类

Maven有3套相互独立的生命周期

  1. clean: 清理工作
  • clean: 移除上一次构建生成的文件
  1. default: 核心工作(如: 编译,测试,打包,安装,部署)
  • compile: 编译项目源代码
  • text: 运行测试
  • package: 将编译后的文件打包, 如jar, war包
  • install: 安装项目到本地仓库
  1. site: 生成报告,发布站点等

执行顺序

在同一套生命周期中, 当运行后面的阶段时, 前面的阶段都会运行

  1. 双击执行install周期, 但是test等周期默认也会执行
  2. 如果需要的话, 可以指定禁用周期

执行

执行maven指定的生命周期有两种方式

1.命令执行

在项目所在目录使用命令行工具, 执行指定命令, 执行maven的声明周期

  • mvn clean
  • mvn compile
  • mvn package
  • mvn test
2.双击执行

在idea中使用maven工具栏, 双击生命周期执行

3.执行原理

maven本身不执行任何操作, 所有的操作都是通过绑定的插件进行的, 所以maven的本质是一个插件集合

  1. 当我们双击生命周期阶段,运行程序时
  2. 实际上是与生命周期绑定的插件在工作

分模块设计

将项目按照功能拆分成若干个子模块, 方便项目的管理和维护, 也方便模块间的相互调用, 资源共享

需求: 完成tlias项目的模块拆分

拆分实体类Pojo

目标: 创建maven 模快 tlias-pojo, 存放实体类

1.新建模块: new Module -> Maven -> Next

2.转移实体类: 连包带类一起复制到新模块中

3.在新模块中引入实体类需要的依赖, 以解决报错

    <dependencies><!-- lombok依赖  --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency></dependencies>

4.引入模块: 在原始的项目中引入拆出去的模块

   <!--  拆分的tlias-pojo模块 --><dependency><groupId>com.itheima</groupId><artifactId>tlias-pojo</artifactId><version>1.0-SNAPSHOT</version></dependency>

拆分工具类Utils

目标: 创建maven 模块 tlias-utils, 存放相关工具类

步骤: 与拆分实体类的步骤一致

注意: 引入web起步依赖时, 由于没有父工程限制, 需要指定版本, 版本与项目工程中的保持一致

继承

继承关系

继承描述的是两个工程间的关系, 子工程可以继承父工程中的配置信息, 常见于依赖关系的继承

1.作用: 简化依赖配置, 统一管理依赖

2.继承关系: 子工程继承父工程, 父工程继承spring-boot-stater-parent工程

3.目录结构: 两种工程结构都可以, 但是嵌套的父子结构看上去更清晰

需求: 改造tlias项目

1.创建父工程

  • 创建maven模块tlias-parent, 该工程为父工程, 设置打包方式为pom(默认jar)

  • 父工程不写具体逻辑代码,可以把src删掉
  • 让父工程设置继承官方工程
<?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>//1.继承官方工程 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>// 注意版本号<version>3.2.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.itheima</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version><!--   2.设置打包方式为pom --><packaging>pom</packaging><dependencies><!-- lombok依赖  --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies></project>

2.子工程继承父工程: pom.xml文件中

// 配置继承关系
<parent><groupId>com.itheima</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version>// 指定父工程相对位置<relativePath>../tlias-parent/pom.xml</relativePath>
</parent>

3.管理共有依赖

<?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><dependencies><!-- lombok依赖  --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency></dependencies></project>
  • 在父工程中配置子工程共有的依赖, 子工程会自动继承父工程的依赖
  • 若父子工程都配置了同一个依赖的不同版本, 最终以子工程为准

版本锁定

在Maven中, 可以在父工程的pom文件中, 通过 <dependencyManagement> 来统一管理依赖版本

<!--  版本锁定  -->
<dependencyManagement><dependencies><!--JWT令牌生成--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>       </dependencies>
</dependencyManagement>
<dependencies><!-- JWT令牌依赖--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency>
</dependencies>
  1. 通过版本锁定, 分散在子工程的依赖版本由父工程统一管理
  2. 版本锁定只管理版本, 子程序还是需要引入依赖的, 只是不需要指定版本了

自定义属性: 父工程统一管理依赖版本后, 可以使用自定义属性, 集中定义依赖版本, 无需上下翻找

<?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><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><!--  自定义属性 --><!--  格式: 自定义属性名.version --><lombok.version>1.18.24</lombok.version><mybatis.version>3.0.3</mybatis.version><pagehelper.version>1.4.6</pagehelper.version><fastjson.version>1.2.76</fastjson.version><aliyunsdkoss.version>3.15.1</aliyunsdkoss.version><jaxbapi.version>2.3.1</jaxbapi.version><activation.version>1.1.1</activation.version><jaxbruntime.version>2.3.3</jaxbruntime.version><jjwt.version>0.9.1</jjwt.version></properties><dependencies><!-- lombok依赖  --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>//  属性引用 <version>${lombok.version}</version></dependency></dependencies><!--  版本锁定  --><dependencyManagement><dependencies><!--  mybatis起步依赖  --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency>... ...</dependencies></dependencyManagement>
</project>
  1. dependencies是直接依赖, 在父工程中配置了依赖, 子工程就会直接继承下来
  2. dependencyManagement是版本管理, 只管理依赖的版本, 使用时子工程仍然需要引入依赖坐标

聚合

项目开发完成后需要打包, 分模块开发时, 打包前需要手动安装其他模块, 保证本地仓库中存在该模块, 才能打包成功, 否则可能会找不到相关模块, 造成打包失败

概念: 聚合就是把多个模块作为一个整体进行项目构建, 简化项目打包过程

  1. 聚合工程: 一个不具有业务功能的工程(有且只有一个pom文件),
  2. 最佳实践: 通常情况下, 聚合工程和继承中的父工程共用一个
  3. 实际作用: 构建项目直接在聚合工程上构建, 无需手动构建依赖关系

实现: maven中可以通过<modules>设置当前聚合工程所包含的子模块名称

<?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><!--聚合其他模块--><modules><module>../tlias-pojo</module><module>../tlias-utils</module><module>../tlias_web_management</module></modules>... ...
</project>
  1. 打包: 在聚合工程中聚合其他模块, 然后再聚合工程上构建项目
  2. 执行: 聚合工程中所包含的模块, 在构建时, 会自动根据模块间的依赖关系设置构建顺序, 与书写顺序无关

继承与聚合的关系

私服

私服是一种特殊的远程仓库, 它是架设在局域网内的仓库服务, 用来代理位于外部的中央仓库, 解决团队内部资源共享和资源同步的问题

  1. 使用私服后, 依赖查找顺序为: 本地仓库 -> 私服 -> 中央仓库

使用私服就是学习资源的的上传与下载

  1. RELEASE(发行版本): 功能趋于稳定, 当前更新停止, 可以用于发行的版本, 储存在私服中的RELEASE仓库中
  2. SNAPSHOT(快照版本): 功能不稳定, 尚处于开发中的版本,即快照版本, 储存在私服的SHAPSHOT仓库中
  3. CENTRAL(官方版本): 中央仓库中下载的依赖, 储存在私服的CENTRAL仓库中

连接私服是比较固定的操作, 资料中也提供了配置文档, 可以参照配置

  1. 设置私服的访问用户名和密码 (maven安装目录/settings.xml文件/server中配置)

  1. IDEA中的maven工程的pom文件中配置上传(发布)地址

  1. 设置私服依赖下载的仓库组地址( settings.xml中的mirrors / profiles中配置)

资源上传: 执行maven的deploy生命周期, 发布资源到私服中, 同私服的其他同事就可以下载使用了

  1. 资源上传到私服的位置, 由资源的版本决定

资源下载: 连接私服后, 引用依赖的坐标, 刷新后, maven就会自动到私服中下载资源

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

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

相关文章

数据中心可视化管理平台:提升运维效率

通过图扑可视化平台实时监控设备状态、能耗和网络流量&#xff0c;帮助运维团队快速识别和处理异常&#xff0c;提高运营效率&#xff0c;确保系统稳定与可靠性。

SPI--原理

SPI–原理 前言: 若对 SPI 通讯协议不了解&#xff0c;可先阅读《SPI 总线协议介绍》文档的内容学习。 关于 FLASH 存储器&#xff0c;请参考“常用存储器介绍”章节&#xff0c;实验中 FLASH 芯片的具体参数&#xff0c;请参考 其规格书《W25Q64》来了解。 大纲 SPI协议S…

glb数据格式

glb数据格式 glb 文件格式只包含一个glb 文件&#xff0c;文件按照二进制存储&#xff0c;占空间小 浏览 浏览glb工具的很多&#xff0c;ccs&#xff0c;3D查看器等都可以&#xff0c;不安装软件的话用下面网页加载就可以&#xff0c;免费 glTF Viewer (donmccurdy.com) glb…

Makefile 学习笔记(一)gcc编译过程

环境准备 .linux 系统(虚拟机) VS code linux 编译过程 预处理: 把.h .c 展开形成一个文件.宏定义直接替换 头文件 库文件 .i 汇编&#xff1a; .i 生成一个汇编代码文件 .S 编译&#xff1a; .S 生成一个 .o .obj 链接: .o 链接 .exe .elf gcc c语言 g c语言 gcc的使用 …

MySQL之表内容的增删改查(含oracel 9i经典测试雇佣表下载)

目录 一:Create 二:Retrieve 1.select列 2.where条件 3.结果排序 4. 筛选分页结果 三:Update 四:Delete 1.删除数据 2. 截断表 五&#xff1a;插入查询结果 六&#xff1a;聚合函数 七:group by子句的使用 表内容的CRUD操作 : Create(创建), Retrieve(读取)…

数据结构之栈(python)

栈&#xff08;顺序栈与链栈&#xff09; 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作&#xff08;包含入栈和出栈&#xff09;2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…

吐血整理资料后,测试面试相关的资料大全

最近假期收集资料的过程真的让我吐血。 在博客上随便搜一点资料&#xff0c;好多只能看一般&#xff0c;或者打着分享资源&#xff0c;但实际上并不是了。而且大部分资料就是网上找的&#xff0c;恰饭不好评价&#xff0c;但体验真的好差啊&#xff01; 我搜集了很多面试资料…

流程图怎么画?3个好用的在线流程图软件推荐,绘图没烦恼!

目录 什么是流程图&#xff1f; 为什么需要使用流程图&#xff1f; 流程图中各种图形的含义 如何制作流程图&#xff1f; 小结&#xff1a;流程图如何制作&#xff1f; 流程图是表达工作流程或者系统操作过程的有效工具&#xff0c;被广泛应用于各个行业和领域。…

Centos7环境下Hive的安装

Centos7环境下Hive的安装 前言一、安装Hive1.1 下载并解压1.2 配置环境变量1.3 修改配置1. hive-env.sh2. hive-site.xml 1.4 拷贝数据库驱动1.5 初始化元数据库报错 1.6 安装MySQL1.7 启动 二、HiveServer2/beeline2.1 修改Hadoop配置2.2 修改Hive配置2.2 启动hiveserver22.3 …

2024/9/16 dataloader、tensorboard、transform

一、pytorch两大法宝元素 假设有一个名为pytorch的包 dir()&#xff1a;用于打开包&#xff0c;看里面的内容 help():用于查看具体的内容的用处 二、python文件&#xff0c;python控制台和jupyter的使用对比 三、pytorch读取数据 pytorch读取数据主要涉及到两个类&#xff1…

基于 PyQt5 和 OpenCV 进行图像处理操作的GUI工具初版

为了实现一个基于 PyQt5 和 OpenCV 的图形用户界面&#xff08;GUI&#xff09;&#xff0c;要求如下&#xff1a; 左边显示加载的图片。 中间提供各种对图片进行处理的操作方法&#xff08;如灰度化、模糊处理等&#xff09;。 右边显示处理后的效果图。 接下来我将详细讲解如…

【C语言零基础入门篇 - 5】:探索C语言中丰富多样的选择和循环结构

文章目录 选择分支结构if选择结构if...else...选择结构if...else if...else 嵌套选择结构switch多分支结构 循环结构for 循环while 循环do … while 循环 跳转语句 选择分支结构 if选择结构 基本格式&#xff1a;if&#xff08;表达式1)语句1; 功能&#xff1a;如果表达式1…

坚持的力量--完成向CSDN迁移500篇技术文章阶段小记-以此自勉

前言&#xff1a;本文为迁移前的博客中的文章《坚持的力量-写给第1000篇文章笔记》发表于 publish:May 14, 2021 -Friday&#xff0c;作为原个人博客中累计写满1000篇文章的总结和鼓励。因在向CSDN迁移文章的过程中进行了一些文章合并等调整&#xff0c;总文数大量下降&#xf…

【建设方案】固定资产信息系统建设方案(功能清单列表2024word原件)

固定资产管理系统需求要点&#xff1a; 1. 实现公司内部固定资产管理全生命周期管理&#xff0c;包括资产采购、资产入库、资产领用、资产借用、资产归还、资产报废、资产维修、资产调拨等全过程管理。 2. 可实现集团内部固定资产盘点管理&#xff0c;包括盘点计划、盘点查询等…

Python数据分析与可视化的全面指南

目录 引言 一、Python数据分析基础 1. 为什么选择Python进行数据分析&#xff1f; 2. 常用的数据分析库 二、环境配置 1. 安装Python 2. 安装Anaconda&#xff08;可选&#xff09; 3. 创建虚拟环境 4. 安装必要的库 三、数据分析流程 四、数据处理与分析 1. 导入库…

【PHP代码审计】PHP基础知识

&#x1f31d;博客主页&#xff1a;菜鸟小羊 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 php简介 php是什么&#xff1f; php&#xff08;全称&#xff1a;Hypertext Preprocessor&#xff0c;即超文本预处理器&…

圆环加载效果

效果预览 代码实现 from PyQt5.QtCore import QSize, pyqtProperty, QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QColor, QPainter from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QVBoxLayout, QLabel, QGridLayoutclass Cir…

数据与结构算法平衡二叉树详解叉树--基本概念

平衡二叉树&#xff08;Balanced Binary Tree&#xff09;又被称为AVL树&#xff08;有别于AVL算法&#xff09;&#xff0c;且具有以下性质&#xff1a;它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1&#xff0c;并且左右两个子树都是一棵平衡二叉树。这个方案很好…

图解Redis 01 | 初识Redis

什么是 Redis&#xff1f; Redis 是一种基于内存的数据库&#xff0c;所有的数据读写操作都在内存中完成&#xff0c;因此读写速度非常快。它被广泛应用于缓存、消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务需求&#xff0c;如 String、Hash、List、…

环形数组与单向链表的队列实现(Queue)

什么是队列 队列是一种重要的线性数据结构&#xff0c;具有先进先出&#xff08;FIFO&#xff09;的特性。元素的插入操作称为入队&#xff0c;删除操作称为出队。队列在许多计算机科学应用中非常常见&#xff0c;如任务调度和数据缓冲等。 在实现队列时&#xff0c;可…