Maven Shade插件是否会直接读取已Shade Jar中的依赖并忽略POM配置?
Maven Shade插件依赖冲突问题解析
你的推测完全正确:Maven Shade插件处理已被shade打包的Jar时,会直接读取Jar内部包含的依赖类,完全忽略当前POM里的依赖定义,以及对该shade Jar的<exclusions>排除配置。
原因分析
- Maven的
<exclusions>标签仅对传递性依赖生效——也就是基于模块POM中声明的依赖关系来排除外部依赖。但当A模块用Shade插件把Gson 2.2打包进自身Jar后,Gson的类已经成为A Jar的一部分,不再是Maven能识别的“外部传递依赖”,自然无法通过<exclusions>排除。 - Shade插件的核心功能是将依赖类合并到主Jar中,生成包含所有依赖的“胖Jar”。当B模块依赖这个已shade的A Jar时,B的Shade插件在打包过程中,会直接读取A Jar里的所有类(包括Gson 2.2),不会校验B的POM依赖规则或排除配置——因为这些类已经不是独立的依赖项,而是A Jar的组成部分。
是否属于Bug?
这不是Bug,而是Shade插件的设计逻辑。Shade插件的定位就是创建包含所有依赖的可执行Jar,它会把依赖类合并到主Jar中,这些合并后的类会被视为Jar本身的一部分,而非外部依赖。Maven的依赖管理机制(包括排除、版本仲裁)只作用于POM中声明的独立依赖,无法干预已经被打包进Jar的类。
内容的提问来源于stack exchange,提问作者K F
相关产品推荐
相关产品推荐

