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

Maven依赖scope:从编译到打包,一张图理清生命周期与classpath

Maven依赖scope全解析构建生命周期与classpath的精准控制当你盯着pom.xml里那些scopecompile/scope标签时是否曾好奇它们究竟如何影响你的构建流程Maven的依赖scope就像一个个精密的开关控制着依赖项在编译、测试、打包和运行各个阶段的可见性。理解这些scope的运作机制能让你避免90%的依赖冲突和打包问题。1. 生命周期视角下的scope作用矩阵Maven构建过程可以分解为几个关键阶段源码编译、测试编译、测试运行、打包和部署运行。每个scope决定了依赖在这些阶段是否会被包含在classpath中以及是否会被打包进最终产物。Scope源码编译测试编译测试运行打包部署运行compile✔✔✔✔✔provided✔✔✔✖✖runtime✖✖✔✔✔test✖✔✔✖✖system✔✔✔✖*✖**注system scope默认不打包但可通过includeSystemScopetrue/includeSystemScope配置强制包含典型应用场景举例compile项目核心依赖如Spring Coreprovided容器已提供的依赖如servlet-apiruntime仅运行时需要的驱动如JDBC驱动test单元测试框架如JUnit2. 技术栈实战Spring Boot与传统Web应用的scope策略2.1 Spring Boot可执行Jar的特殊性Spring Boot的fat jar打包方式改变了传统scope的某些行为规则dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId scopeprovided/scope !-- 开发阶段使用内嵌Tomcat -- /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope !-- 驱动只需运行时可用 -- /dependency常见陷阱将provided范围的依赖错误地打包进fat jar会导致类加载冲突忘记将数据库驱动设为runtime可能导致编译时意外引用实现类2.2 传统War包部署到Tomcat的配置要点dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope !-- 容器已提供 -- /dependency dependency groupIdorg.hibernate/groupId artifactIdhibernate-core/artifactId version5.4.32.Final/version !-- 默认compile需要打包 -- /dependency对比差异War包部署时provided依赖必须确保与容器版本匹配第三方库的传递依赖需要特别注意scope的传递性3. import scope的进阶用法BOM的版本控制艺术importscope是唯一不影响classpath的特殊scope它专为依赖管理设计dependencyManagement dependencies dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version2021.0.3/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement运作原理仅在dependencyManagement部分有效将目标POM的dependencyManagement内容合并到当前POM不实际引入任何依赖仅影响版本号解析最佳实践企业级项目推荐使用内部BOM管理所有第三方依赖版本多模块项目中父POM用import继承公司级BOM结合properties实现灵活版本覆盖4. 疑难场景与解决方案4.1 系统依赖(system scope)的现代替代方案虽然systemscope允许引用本地jar但在协作开发中会带来可移植性问题。现代替代方案包括安装到本地仓库mvn install:install-file -Dfilelib/custom.jar -DgroupIdcom.example -DartifactIdcustom -Dversion1.0 -Dpackagingjar使用Nexus私有仓库repositories repository idcompany-repo/id urlhttp://nexus.example.com/repository/maven-public//url /repository /repositories4.2 测试依赖(test scope)的边界控制测试依赖泄漏到生产代码是常见问题可通过以下方式防范在IDE中配置不同的源码路径使用Maven Enforcer插件添加规则检查plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-enforcer-plugin/artifactId version3.0.0/version executions execution idenforce-test-scope/id goals goalenforce/goal /goals configuration rules bannedDependencies excludes excludejunit:junit/exclude /excludes searchTransitivetrue/searchTransitive scopecompile/scope /bannedDependencies /rules /configuration /execution /executions /plugin4.3 多模块项目的scope继承策略在父子模块结构中scope的传递需要特别注意父POM声明dependencyManagement dependencies dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId version2.13.3/version scopecompile/scope /dependency /dependencies /dependencyManagement子模块引用dependencies dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId !-- 继承父POM的version和scope -- /dependency /dependencies关键规则子模块可以覆盖父POM定义的scopedependencyManagement中的scope只作为默认值传递性依赖的scope会按照依赖图计算最终值

相关文章:

Maven依赖scope:从编译到打包,一张图理清生命周期与classpath

Maven依赖scope全解析&#xff1a;构建生命周期与classpath的精准控制 当你盯着pom.xml里那些<scope>compile</scope>标签时&#xff0c;是否曾好奇它们究竟如何影响你的构建流程&#xff1f;Maven的依赖scope就像一个个精密的开关&#xff0c;控制着依赖项在编译、…...

从ENVI到MATLAB:高光谱图像处理工作流迁移指南(以真假彩色显示为例)

从ENVI到MATLAB&#xff1a;高光谱图像处理工作流迁移指南&#xff08;以真假彩色显示为例&#xff09; 对于长期使用ENVI进行遥感影像分析的研究者而言&#xff0c;MATLAB的编程环境提供了截然不同的工作流体验。本文将聚焦高光谱图像可视化这一基础但关键的操作&#xff0c;系…...

英语长期没进步?大多是学习方式错了

很多人英语学了很久却毫无起色&#xff0c;归根结底&#xff0c;都栽在了同一个核心问题上。前阵子整理电脑文件&#xff0c;我翻出了早年的英语学习笔记。厚厚几十页的单词汇总、密密麻麻的语法批注&#xff0c;收藏夹里囤了上百个教学视频&#xff0c;还有曾经热血满满给自己…...

GD32/STM32串口高效收数秘籍:巧用IDLE中断判断一帧数据收完

GD32/STM32串口高效收数实战&#xff1a;IDLE中断DMA的黄金组合 在嵌入式开发中&#xff0c;串口通信就像设备间的"普通话"&#xff0c;但如何高效接收不定长数据帧却让不少工程师头疼。想象一下无人机飞控与地面站的通信场景&#xff1a;数据包可能短至几个字节的指…...

什么,锐捷极简以太彩光一张网竟然有两幅面孔?

在园区网络的建设中&#xff0c;我们常常面临一个两难选择&#xff1a;教学或办公楼需要大带宽&#xff0c;宿舍或病房楼需要弹性带宽。如果分别建两张网&#xff0c;成本翻倍、运维复杂。 锐捷极简以太彩光方案给出的答案是&#xff1a;一张物理网络&#xff0c;同时融合两种…...

从B73到5000个RILs:手把手拆解玉米NAM群体构建的完整流程与关键决策

玉米NAM群体构建全流程解析&#xff1a;从亲本筛选到RILs优化的科学决策 站在玉米遗传研究的十字路口&#xff0c;我们常常面临一个核心挑战&#xff1a;如何在有限资源下构建既能捕获广泛遗传多样性&#xff0c;又能实现精准定位的群体&#xff1f;2009年&#xff0c;Buckler团…...

ChatGPT生成的SQL注入漏洞代码竟通过了87%静态扫描器?安全团队紧急避坑指南(含检测脚本)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ChatGPT生成的SQL注入漏洞代码竟通过了87%静态扫描器&#xff1f;安全团队紧急避坑指南&#xff08;含检测脚本&#xff09; 近期&#xff0c;某金融企业安全团队在代码审计中发现&#xff0c;一段由ChatGPT生…...

新能源场站通信实战:IEC104与Modbus TCP协议网关开发要点与配置指南

新能源场站通信实战&#xff1a;IEC104与Modbus TCP协议网关开发要点与配置指南 在新能源场站的监控系统中&#xff0c;协议转换网关扮演着至关重要的角色。光伏电站的逆变器、风电场的变流器、充电桩的智能电表等设备通常采用Modbus TCP协议进行数据采集&#xff0c;而电网调度…...

12个简单步骤:CFDPython教你从零掌握计算流体动力学核心算法

12个简单步骤&#xff1a;CFDPython教你从零掌握计算流体动力学核心算法 【免费下载链接】CFDPython A sequence of Jupyter notebooks featuring the "12 Steps to Navier-Stokes" http://lorenabarba.com/ 项目地址: https://gitcode.com/gh_mirrors/cf/CFDPyth…...

嘉立创EDA专业版安装避坑指南:从下载到第一个ESP32项目实战

嘉立创EDA专业版安装避坑指南&#xff1a;从下载到第一个ESP32项目实战 第一次打开嘉立创EDA专业版时&#xff0c;那个深蓝色界面让我想起了学生时代第一次接触电路设计的场景。作为国产EDA工具的后起之秀&#xff0c;它用更符合国人习惯的操作逻辑和实惠的打板政策&#xff0c…...

从 0 到 1:用魔珐星云打造真实可用的智能健身私教【技术原理文章】

> 我在学习具身智能的实战文章&#xff0c;本文为技术文章&#xff0c;非广告一、健身交互痛点&#xff1a;传统数字人 / 健身工具缺失沉浸式陪伴式互动日常健身长期存在行业共性痛点&#xff1a;不管是纯视频课程&#xff0c;还是传统云端实时交互数字人&#xff0c;都难以…...

80C166/C167芯片内部RAM执行代码技术详解

1. 80C166/C167芯片内部RAM执行代码的技术解析在嵌入式系统开发中&#xff0c;有时我们需要将特定代码从ROM复制到芯片内部RAM执行。这种需求常见于需要改变总线模式的场景&#xff0c;比如在Siemens 80C166/C167微控制器上切换8位/16位模式或改变总线复用配置。根据Siemens官方…...

ngx_http_set_virtual_server

1 定义 ngx_http_set_virtual_server 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.cstatic ngx_int_t ngx_http_set_virtual_server(ngx_http_request_t *r, ngx_str_t *host) {ngx_int_t rc;ngx_http_connection_t *hc;ngx_http_core_loc_con…...

服务器末级缓存管理优化与Garibaldi架构解析

1. 服务器末级缓存管理的核心挑战 在现代服务器架构中&#xff0c;末级缓存(Last-Level Cache, LLC)作为CPU与主存之间的关键缓冲层&#xff0c;其管理效率直接影响系统整体性能。传统LLC管理面临一个根本性矛盾&#xff1a;随着核心数量增加和负载多样化&#xff0c;有限的缓存…...

C51编译器浮点数支持与嵌入式优化实践

1. C51编译器对浮点数的支持解析作为一名在嵌入式领域摸爬滚打多年的老工程师&#xff0c;我深知在8位单片机上进行浮点运算的痛点。最近有同行问我关于Keil C51编译器对浮点数的支持情况&#xff0c;这让我想起自己早年从PL/M-51转向C51时遇到的类似困惑。本文将结合官方文档和…...

微信小程序 社区老年人健康管理系统

目录同行可拿货,招校园代理 ,本人源头供货商项目背景核心功能技术实现服务模式社会效益项目技术支持源码获取详细视频演示 &#xff1a;同行可合作点击我获取源码->获取博主联系方式->进我个人主页-->同行可拿货,招校园代理 ,本人源头供货商 项目背景 随着老龄化社会…...

DPO vs PPO:两种AI对齐技术到底选哪个?我全试了一遍

整整一个月的实验&#xff0c;四块4090烧了不知道多少电费。这不算什么&#xff0c;真正让我崩溃的是——跑了三天的PPO训练&#xff0c;在最后一刻因为reward model打分偏差炸了。 那一刻我真的很想摔键盘。 但后来换上DPO重新跑&#xff0c;12小时搞定&#xff0c;效果还更…...

2026年南京Geo公司将有何新动态?一起探寻其发展新方向!

在数字化浪潮汹涌澎湃的当下&#xff0c;AI智能营销领域正经历着前所未有的变革。顺炫科技作为该领域的深耕者&#xff0c;一直致力于为全球客户提供高效、智能的数字化推广解决方案。随着2026年的到来&#xff0c;顺炫科技又将有哪些新动态&#xff0c;其发展新方向又将指向何…...

微信小程序 消防知识学习平台系统

目录同行可拿货,招校园代理 ,本人源头供货商项目概述核心功能技术实现特色亮点适用场景项目技术支持源码获取详细视频演示 &#xff1a;同行可合作点击我获取源码->获取博主联系方式->进我个人主页-->同行可拿货,招校园代理 ,本人源头供货商 项目概述 微信小程序“消…...

【awinic inside】音质续航,听声辨位 | 艾为芯助力小天才AI手表Z12

...

【MySQL 三大日志深度解析】:redo log、undo log、binlog 作用与两阶段提交原理

&#x1f525;你好我是fengxin_rou这是我的个人主页fengxin_rou的主页 ❄️欢迎查看我的专栏我的专栏 《Java后端学习》、《JAVASE基础》、《JUC并发》、《redis》、《JVM虚拟机》、《MYSQL》、《黑马点评》、《rabbitmq》、《JavaWebAI的talis学习系统》、《苍穹外卖》 前言…...

用wireshark抓取分析EtherCAT报文

&#x1f4dc; 第1章&#xff1a;EtherCAT报文结构 EtherCAT报文结构及Wireshark对应显示&#xff1a; 以太网帧头&#xff1a;14字节&#xff0c;包含目标/源MAC地址&#xff0c;帧类型 (EtherType) 固定为 0x88A4。EtherCAT帧头&#xff1a;2字节&#xff0c;包含一个11位的“…...

AI技术的未来发展方向

AI技术的未来发展方向AI技术的未来发展将围绕以下几个关键领域展开&#xff0c;这些方向不仅推动技术进步&#xff0c;也深刻影响社会和经济结构。通用人工智能&#xff08;AGI&#xff09;的探索AGI旨在实现与人类智能相当的通用性&#xff0c;能够跨领域学习和推理。当前研究…...

Python运算符:逻辑运算符(and/or/not)的短路特性

Python运算符&#xff1a;逻辑运算符&#xff08;and/or/not&#xff09;的短路特性&#x1f4da; 本章学习目标&#xff1a;深入理解逻辑运算符&#xff08;and/or/not&#xff09;的短路特性的核心概念与实践方法&#xff0c;掌握关键技术要点&#xff0c;了解实际应用场景与…...

通用人工智能(AGI)完整技术方案:以字序生命模型(WOLM)为认知内核的双脑协同架构

一、AGI的终极定义在讨论技术方案之前&#xff0c;先定义什么是AGI。当前主流的AGI定义&#xff0c;强调一个系统能在绝大多数人类能做的智力任务上达到或超越人类水平。这个定义隐含了一个假设&#xff1a;AGI的核心是“智力”——逻辑推理、知识储备、创造力。我们的定义不同…...

python文化旅游服务系统 小程序系统

目录同行可拿货,招校园代理 ,本人源头供货商项目概述核心功能技术栈项目亮点应用场景项目技术支持源码获取详细视频演示 &#xff1a;同行可合作点击我获取源码->->进我个人主页-->获取博主联系方式同行可拿货,招校园代理 ,本人源头供货商 项目概述 Python文化旅游服…...

Logback 日志框架使用与配置指南

1. Logback 核心概念与架构 Logback 是 Java 生态中最主流的日志框架之一&#xff0c;其配置体系主要围绕以下三个核心概念展开&#xff1a; Logger&#xff08;日志记录器&#xff09;&#xff1a;负责捕获日志事件。它通过 name 属性&#xff08;通常是包名或类名&#xff09…...

论软件系统建模方法及其应用——以飞秒激光加工控制系统为例

摘要 2024年1月,我参与了某精密制造企业“高精度飞秒激光加工控制系统”项目的研发,担任系统架构设计师,主要负责系统建模、核心模块设计与集成测试。该项目旨在开发一套用于航空叶片微孔加工的数控系统,要求实现1μm的定位精度、实时补偿与工艺自适应调整。系统具有强实时…...

视频拖动进度条时如果落在GOP内,是怎么定位的?

视频拖动进度条时的 GOP 定位行为说明 0. 名词解释&#xff1a;Seek 是什么&#xff1f; Seek&#xff08;寻址/定位&#xff09;来自英文 “seek”&#xff08;寻找、定位&#xff09;&#xff0c;在视频/音频领域特指将播放位置跳转到指定时间点的操作。 用户拖动进度条、点击…...

DataStore vs SharedPreferences 迁移指南:告别 ANR,拥抱类型安全

DataStore vs SharedPreferences 迁移指南&#xff1a;告别 ANR&#xff0c;拥抱类型安全 一句话收益&#xff1a;掌握从 SharedPreferences 迁移到 Jetpack DataStore 的完整路径&#xff0c;彻底消除主线程 I/O 阻塞与类型安全隐患。 适用版本&#xff1a;Android API 21&…...