当前位置: 首页 > news >正文

Maven进阶知识

一、Maven 坐标

(一)概念

在 Maven 中坐标是构件的唯一标识,其元素包括 groupId、artifactId、version、packaging、classifier。其中 groupId、artifactId、version 是必定义项,packaging 默认为 jar。

(二)意义

为 Maven 世界中海量构件提供统一规范的唯一标识,便于机器自动查找。

(三)含义详解

  1. groupId :组织标识,通常是公司网址反写加项目名(如 com.example.project)。

  2. artifactId :项目名,一般格式为项目名 - 模块名(如 myproject - core)。

  3. version :版本号,形式如 0.0.1 - SNAPSHOT。第一位大版本号,第二位分支版本号,第三位小版本号。后缀有特定含义,如 SNAPSHOT(快照版本)、ALPHA(内测)、BETA(公测)、RELEASE(稳定)、GA(正式发布)。

  4. packaging :打包方式,常见有 pom、jar、war 等。

  5. classifier :辅助定义构件输出的附属构件。

  6. 如图

二、依赖

(一)意义

解决项目中对各类外部库的依赖管理难题,Maven 能自动下载并妥善放置依赖至本地仓库,通过在 POM 文件 dependencies 元素内声明依赖关系。

(二)使用示例

以引入 junit - 4.9.jar 包为例:

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope>
</dependency>

属性说明:三维坐标用于定位依赖包;scope 控制依赖包在何种场景加入 classpath,可去 Maven 官网中央仓库查找依赖。

(三)依赖范围

Maven 项目开发涉及三套 classpath:

  1. 主代码 :main 下主代码编译依赖。

  2. 测试代码 :test 下测试代码编译依赖。

  3. 运行时 :main 代码运行时依赖。

依赖范围通过 scope 标签设置,共 6 种:

  1. compile :默认,对编译、测试、运行 classpath 都有效。

  2. test :仅对测试 classpath 有效,如 JUnit。

  3. provided :对编译与测试有效,运行时无效。例如 web 开发中 servlet - api,编译测试用到,运行时由容器提供,打 war 包时不放入 WEB - INF/lib。

  4. runtime :与 provided 相对,运行时有效。像 jdbc 编写是接口规范,运行需具体实现类 jar 包。

  5. 例如:

(四)依赖传递与可选依赖

  1. 依赖传递 :若 A 依赖 B,C 依赖 A,则 C 也会依赖 B。

  2. 依赖阻断 :B 中加入 <optional>true</optional> 标签,B 就不会被传递。

  3. 可选依赖 :要排除依赖中某项,用 exclusion 属性。例如在 C 中排除 A 中的 B 依赖,示例代码如下:

<dependency><groupId>a - group</groupId><artifactId>a - artifact</artifactId><version>a - version</version><exclusions><exclusion><groupId>b - group</groupId><artifactId>b - artifact</artifactId></exclusion></exclusions>
</dependency>

三、仓库

(一)概述

Maven 仓库是存放项目依赖的第三方库等构件的地方,帮助管理构件。

仓库类型有本地、中央、远程仓库。

(二)本地仓库

  1. 初次执行 Maven 命令时创建,默认在用户目录下(Linux 和 Windows 均如此),路径为%USER_HOME%/.m2/repository/。

  2. 运行 Maven 时,优先从本地仓库获取构件,若没有则从远程仓库下载至本地再使用。

  3. 可通过修改%Maven_HOME%/conf/settings.xml 文件中的配置更改默认位置。

(三)中央仓库

  1. 由 Maven 社区管理,包含大量常用开源 Java 构件及相关信息。

  2. 无需额外配置,但需网络访问。

(四)依赖搜索顺序

四、继承和聚合

(一)继承

  1. 意义 :避免重复配置,提升项目安全性与管理便捷性。多个子模块可继承父模块的公共配置,如公共依赖、插件配置、仓库地址等。

  2. 可继承 POM 元素groupId :项目组 ID,项目坐标的核心元素;version :项目版本,项目坐标的核心元素;description :项目的描述信息;organization :项目的组织信息;inceptionYear :项目的创始年份;url :项目的 url 地址;developers :项目的开发者信息;contributors :项目的贡献者信息;distributionManagement :项目的部署信息;issueManagement :缺陷跟踪系统信息;ciManagement :项目的持续集成信息;scm :项目的版本控制信息;mailingListserv :项目的邮件列表信息;properties :自定义的 Maven 属性;dependencies :项目的依赖配置;dependencyManagement :项目的依赖管理配置;repositories :项目的仓库配置;build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;reporting :包括项目的报告输出目录配置、报告插件配置等。

  3. IDEA 实现 Maven 继承 :以创建父子项目为例,创建父类项目,再创建子类项目 core、manage、portal 等,子模块继承父模块,观察父子项目的 pom 文件配置差异。

  4. 如图

        创建父类项目 

  

        创建子类项目core 

        以同样的方式创建manage和portal项目: 

        至此,一个由parent统一管理core,manage和portal的mavan项目就创建好了;

观察父子项目的pom文件配置

(二)聚合

暂未在原文中明确提及聚合相关内容,通常聚合用于构建多模块项目,将多个模块聚合在一起构建。

(三)properties 属性使用

通过 properties 元素定义 Maven 属性,在其他地方以 ${属性名称} 引用,消除重复,统一管理。如统一声明 Spring Framework 版本,避免多处重复声明。

相关文章:

  • Python循环语句-for循环(基础语法,range语句,临时变量作用域,嵌套应用)
  • 数据结构与算法-单链表专题
  • Netmiko 源码解析
  • openEuler对比CentOS的核心优势分析
  • 论文阅读:2025 arxiv Reward Shaping to Mitigate Reward Hacking in RLHF
  • Android学习总结之Retrofit篇
  • 生成器(generator)
  • 从新手到高手:小程序开发进阶技巧分享
  • 搭建spark-local模式
  • 《USB技术应用与开发》第四讲:实现USB鼠标
  • RabbitMQ安装流程(Windows环境)
  • 矩阵系统私信功能开发技术实践,支持OEM
  • 传统TDs系统。
  • CentOS7 部署 Ollama 全栈指南:构建安全远程大模型服务
  • Eigen线性代数求解器(分解类)
  • 代码随想录算法训练营Day31 | 56. 合并区间 738.单调递增的数字
  • 代码随想录算法训练营第二十七天(补)
  • ABAP Object Services
  • 通过gap看margin和padding在布局中的应用
  • 多个请求并行改造
  • 一回合摘下“狮心”,张名扬霸气回应观众:再嘘一个我听听
  • 影子调查丨起底“三无”拖拉机产销链:出口掩内销,监管如虚设
  • 仅退款正式成历史?仅退款究竟该不该有?
  • 中青报:“猿辅导员工猝死”事件上热搜,是对健康职场环境的共同关切
  • 网贷放款后自动扣除高额会员费,多家网贷平台被指变相收取“砍头息”
  • 商务部:已有超1.2亿人次享受到以旧换新补贴优惠