Maven:依赖管理就像乐高拼装的艺术

目录

    • 🏗️ 第一章:Maven是高级乐高玩家
      • 🔍 依赖管理的基本单元
    • 🧩 第二章:多模块项目——乐高巨舰组装术
      • 🌟 为什么要拆分模块?
      • 🛠️ 父子POM配置示范
    • ⚔️ 第三章:依赖冲突——乐高零件不兼容事件
      • 🔥 经典冲突场景
      • 🛡️ 三大解决武器
        • 武器1:依赖排除(精准拆除)
        • 武器2:依赖锁定(版本固化)
        • 武器3:mvn命令分析(侦探工具)
    • 🏭 第四章:私服搭建——企业级乐高仓库
      • 🤔 为什么需要私服?
      • 🚧 Nexus私服踩坑记录
        • 坑1:默认admin密码在哪?
        • 坑2:上传jar返回400错误
        • 坑3:代理中央仓库慢
      • 🌟 最佳实践配置
    • 🧰 第五章:Maven高级工具包
      • 🛠️ 常用插件推荐
      • 💡 冷知识:依赖范围(scope)详解
    • 🌟 终极心法

🏗️ 第一章:Maven是高级乐高玩家

🔍 依赖管理的基本单元

<!-- 每个依赖就是一个乐高零件 -->
<dependency><groupId>com.lego</groupId>    <!-- 零件系列 --><artifactId>engine</artifactId> <!-- 具体零件 --><version>2.0</version>         <!-- 零件版本 --><scope>runtime</scope>         <!-- 使用场景 -->
</dependency>

乐高 vs Maven 类比表:

乐高术语Maven对应概念作用
零件包Dependency功能模块
拼装说明书POM.xml构建指南
零件分类箱Local Repository本地仓库
乐高官网Maven Central中央仓库
定制零件商店Nexus/Artifactory私服

💡 小剧场:

当你在pom里加依赖时,Maven就像个乐高管家:

"主人要的’发动机2.0’,我从中央仓库(乐高官网)给您下载~

如果缺零件,我还会去您配置的私服(定制商店)找找!"

🧩 第二章:多模块项目——乐高巨舰组装术

🌟 为什么要拆分模块?

  • 问题场景:单模块项目变成"一锅乱炖"
monolith-project/
├── src/
│   ├── main/
│   │   ├── java/  # 所有代码混在一起
│   │   └── resources/
└── pom.xml        # 依赖列表长达200行!
  • 解决方案:按功能拆分成"乐高模块"
modular-project/
├── api/           # 接口定义
├── core/          # 核心逻辑
├── web/           # 控制器
└── pom.xml        # 父POM管理公共配置

🛠️ 父子POM配置示范

父pom.xml(相当于乐高底板):

<modules>
<module>api</module>
<module>core</module>
<module>web</module>
</modules><!-- 统一管理依赖版本 -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

子模块pom.xml(特定零件包):

<!-- 继承父POM -->
<parent><groupId>com.mycompany</groupId><artifactId>parent</artifactId><version>1.0</version>
</parent><!-- 声明自己的依赖 -->
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 无需写版本,父POM已管理 --></dependency>
</dependencies>

拆分技巧:

  • 按职责划分:比如order-service, user-service
  • 按架构分层:比如model, repository, service
  • 黄金法则:一个模块的变更不应频繁影响其他模块

⚔️ 第三章:依赖冲突——乐高零件不兼容事件

🔥 经典冲突场景

[WARNING] Found conflict:
com.google.guava:guava:jar:
20.0 (compile) vs 30.0-jre (compile)

🛡️ 三大解决武器

武器1:依赖排除(精准拆除)

<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><exclusions><exclusion>  <!-- 排除冲突零件 --><groupId>com.google.guava</groupId><artifactId>guava</artifactId></exclusion></exclusions>
</dependency>
武器2:依赖锁定(版本固化)
<!-- 在dependencyManagement中锁定版本 -->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version>
</dependency>
武器3:mvn命令分析(侦探工具)
# 查看依赖树
mvn dependency:tree# 分析冲突
mvn dependency:analyze-duplicate# 终极武器:图形化展示
mvn dependency:tree -DoutputFile=deps.txt

💡 冲突解决黄金法则:

“就近优先” → Maven会选择依赖树中离项目更近的版本

🏭 第四章:私服搭建——企业级乐高仓库

🤔 为什么需要私服?

  • 加速构建(缓存常用依赖)
  • 托管内部二方库
  • 安全隔离(避免直连外网)

🚧 Nexus私服踩坑记录

坑1:默认admin密码在哪?
# 安装后第一次启动时生成
nexus-install-dir/sonatype-work/nexus3/admin.password
坑2:上传jar返回400错误
# 必须指定repository参数
curl -u admin:password --upload-file my.jar \
http://nexus:8081/repository/maven-releases/com/example/my/1.0/my-1.0.jar
坑3:代理中央仓库慢
# 修改nexus/etc/nexus-default.properties
nexus.remote.storage.connection.timeout=60000
nexus.remote.storage.connection.max.total=200

🌟 最佳实践配置

<!-- settings.xml 配置私服镜像 -->
<mirror><id>nexus</id><url>http://nexus:8081/repository/maven-public/</url><mirrorOf>*</mirrorOf>
</mirror>

🧰 第五章:Maven高级工具包

🛠️ 常用插件推荐

插件作用示例命令
versions依赖版本升级mvn versions:use-latest-versions
dependency分析依赖mvn dependency:analyze
spotbugs静态代码分析mvn spotbugs:check
jacoco测试覆盖率mvn jacoco:report

💡 冷知识:依赖范围(scope)详解

<!-- 像选择乐高使用场景 -->
<dependency><scope>compile</scope>   <!-- 默认值,全程参与 --><scope>provided</scope>  <!-- 容器会提供,如Servlet API --><scope>runtime</scope>   <!-- 仅运行时需要,如JDBC驱动 --><scope>test</scope>      <!-- 只在测试用,如JUnit -->
</dependency>

🌟 终极心法

"好的Maven项目应该像乐高大师的作品:

  • 模块化:每个零件各司其职
  • 低耦合:更换零件不影响整体
  • 可追溯:版本明确不混乱"

👉 行动清单:

  • 用mvn dependency:tree检查你的项目依赖树
  • 尝试将一个单体项目拆分成多模块
  • 搭建本地Nexus私服体验企业级管理

记住:依赖管理不是玄学,而是精确的积木拼装艺术。现在就去优化你的"乐高作品"吧! 🧱✨

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

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

相关文章

空间数据挖掘 期末复习

前言&#xff1a;此篇复习笔记结合了课程ppt和deepseek回答进行总结&#xff0c;如有谬误恳请指正。 期末考例题 &#xff08;名词解释*10、简答*6、论述*6&#xff09; 一、名词解释 数据挖掘 过拟合&#xff08;Overfitting&#xff09; Apriori算法 决策树&#xff08;…

跳跳杆、弹跳杆、Poto stick:百年弹跳玩具的健康与使用分享(大模型改写)

跳跳杆&#xff1a;百年弹跳神器的健康争议与安全指南 &#xff08;用DeepSeek改写前一篇文章&#xff0c;可惜没有接广告&#xff0c;否则植入一些链接多好&#xff09; &#x1f50d; 一、健康功效&#xff1a;惊喜与风险并存 争议性健康主张 坊间流传跳跳杆可能具备&…

WHAT - React Native 开发 App 从 0 到上线全流程周期

文章目录 一、React Native App 开发流程总览二、各阶段详细说明需求分析 & 产品规划技术选型 & 方案确定项目初始化A. 使用 Expo&#xff08;推荐新手&#xff09;B. 使用 React Native CLI&#xff08;自由度更高&#xff09; UI 开发 功能开发&#xff08;主开发阶…

Windows11 无法发现局域网内设备解决方法

临时解决 发生问题绝大多数Windows11 24H2版本&#xff0c;该版本目前来看没有永久解决方案 初步问题可以定位在FDResPub服务问题&#xff0c;重启该服务可以短暂恢复&#xff0c;临时解决方案就是重启该服务&#xff0c;然后把网络设备右键创建快捷方式 做成批处理文件 创建…

张 心理健康咨询相关论文;AI心理咨询数字孪生:个性化风格的突破

张 心理健康咨询相关论文 EmoLLM:多模态情感理解与大型语言模型的结合 PsyDT:使用 LLM 构建具有个性化咨询风格的心理咨询师数字孪生 目前,大型语言模型 (LLM) 在心理咨询领域取得了重大进展。然而,现有的心理健康 LLM 忽略了一个关键问题,即他们没有考虑不同的心理咨…

通达信【千军趋势决策系统】幅图指标

指标功能说明 本指标基于价格波动与趋势转折点,结合K线形态分析,提供多维度买卖信号,适用于股票、期货等趋势交易场景。 核心信号解读 「横扫千军」 触发条件:短期、中期、长期趋势同时确认反转向上。 用法:趋势共振信号,提示较强多头机会,可结合成交量验证。 「出击!…

大模型LoRA微调实践

大模型LoRA微调实践 准备工作 数据集&#xff1a;采用 GitHub 上的 Chinese-medical-dialogue-data 中文医疗对话数据集 Github地址如下&#xff1a; https://github.com/Toyhom/Chinese-medical-dialogue-data 微调模型&#xff1a; Qwen 1.5B模型&#xff08;Qwen2、2.5均…

跟着AI学习C#之项目实践Day1

&#x1f9ed; 实战项目&#xff1a;博客平台系统 - Day1 &#x1f3d7;️ 目标 创建新的 ASP.NET Core 项目添加 EF Core 和 Identity 支持实现用户注册、登录功能运行并测试基本身份验证流程 &#x1f5d2;️ 任务清单 1. 创建新项目 打开 Visual Studio 或 Visual Studi…

Java面试复习指南:基础、面向对象、Java 8新特性及并发编程

Java面试复习指南&#xff1a;基础、面向对象、Java 8新特性、常用框架及并发编程 面试中&#xff0c;Java开发者常被问及多个核心技术点。本文从以下几个方面帮助考生快速复习&#xff1a; Java基础 概念解析&#xff1a;Java是一种面向对象的高级编程语言&#xff0c;具有…

微信小程序form表单手机号正则检验pattern失效

好奇怪啊&#xff0c;h5页面校验没问题&#xff0c;在微信小程序模拟器以及真机运行都失效&#xff0c;排查半天&#xff0c;记录一下 PS&#xff1a;身份证号校验也没问题&#xff0c;就手机号校验有问题&#xff0c;奇奇怪怪的 之前的写法&#xff08;在小程序上不生效&…

基于LQR的双积分小车轨迹跟踪控制系列(三)从连续到离散:双积分小车状态空间的数字实现

为什么要离散化&#xff1f; 以便在数字硬件和仿真程序中使用。 离散化的数学推导 连续状态空间&#xff1a; 双积分小车的简化形式 由于双积分小车的 A 矩阵结构简单&#xff08;A0&#xff09;&#xff0c;矩阵指数可以化简&#xff1a; Python实现&#xff08;示例代码&am…

如何在服务器终端下载百度网盘数据

使用BaiduPCS-Go在终端实现远程服务器对百度网盘数据的上传与下载流程学习 BaiduPCS-Go可用于访问和管理百度网盘文件资源的命令行客户端下载百度网盘数据至服务器从服务器中上传文件至百度网盘中BaiduPCS-Go可用于访问和管理百度网盘文件资源的命令行客户端 下载百度网盘数据…

消息队列:基本知识

定义 队列 Queue 是一种先进先出的数据结构&#xff0c;所以消费消息时也是按照顺序来消费的 消息队列看作是一个存放消息的容器&#xff0c;需要使用消息的时候&#xff0c;直接从容器中取出消息供自己使用即可 参与消息传递的双方称为 生产者 和 消费者 生产者负责发送消…

算法-动态规划-钢条切割问题

钢条切割问题是一个经典的动态规划问题&#xff0c;旨在通过切割钢条获得最大收益。以下是详细解释和解决方案&#xff1a; 问题描述 给定长度为 n 的钢条和价格表 p&#xff0c;其中 p[i] 表示长度为 i 的钢条的价格&#xff08;i 1, 2, ..., n&#xff09;。目标&#xff…

DeepSeek:中国AI开源先锋的技术突破与行业革新

在人工智能技术迅猛发展的浪潮中&#xff0c;DeepSeek&#xff08;深度求索&#xff09;作为中国AI领域的新锐力量&#xff0c;凭借其创新的技术路线和开源策略&#xff0c;正在全球AI舞台上崭露头角。这家由知名量化投资机构幻方量化支持的AI公司&#xff0c;自2023年7月成立以…

cmake:动态链接库(dll)的调用

如题,动态链接库的调用和静态链接库有所不同,现将步骤整理如下。 动态链接库文件 正常情况下,编译的动态链接库有五个生成文件和对应的头文件,在调用中,使用dll文件,lib文件 和头文件。编译生成动态库的步骤和配置见C++:动态链接库的编写,__declspec 用法详解-CSDN博…

SAP调用api

之前是把SAP程序封装成api&#xff0c;然后又接到了需求是sap调用其他api&#xff0c;直接上代码吧 FUNCTION ZRFC_PP_016. *"---------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" …

Idea/Pycharm用法总结

在目录里展开当前文件

Python打卡训练营Day56

DAY 56 时序数据的检验 知识点回顾&#xff1a; 假设检验基础知识 原假设与备择假设P值、统计量、显著水平、置信区间 白噪声 白噪声的定义自相关性检验&#xff1a;ACF检验和Ljung-Box 检验偏自相关性检验&#xff1a;PACF检验 平稳性 平稳性的定义单位根检验 季节性检验 ACF检…

[GESP202312 五级] 烹饪问题

题目描述 有 N N N 种食材&#xff0c;编号从 0 0 0 至 N − 1 N-1 N−1&#xff0c;其中第 i i i 种食材的美味度为 a i a_i ai​。 不同食材之间的组合可能产生奇妙的化学反应。具体来说&#xff0c;如果两种食材的美味度分别为 x x x 和 y y y &#xff0c;那么它们…