maven:maven-shade-plugin插件被误解的参数 keepDependenciesWithProvidedScope

一、问题的诞生:官方文档的模糊描述

maven-shade-plugin 的官方文档中,关于keepDependenciesWithProvidedScope 参数的描述仅有简单一句[1](#1)

keepDependenciesWithProvidedScope

When true, dependencies are kept in the pom but with scope 'provided'; when false, the dependency is removed.

这导致许多开发者(包括我)产生误解,认为该参数可以强制将 provided 作用域的依赖打包到最终 JAR 中。实际上,这是一个错误认知。


二、源码揭秘:参数的真实作用

通过分析 org.apache.maven.plugins.shade.mojo.ShadeMojo 源码[2](#2),我们发现:

1. 生效条件

java 复制代码
if (createDependencyReducedPom) {
    // 当且仅当 createDependencyReducedPom=true 时
    createDependencyReducedPom(artifactIds);
}

keepDependenciesWithProvidedScope 仅在 createDependencyReducedPom=true 时生效


2. 实际行为

在生成 dependency-reduced-pom.xml 文件时,插件会执行以下逻辑:

java 复制代码
private void createDependencyReducedPom(Set<String> artifactsToRemove){
    // 源码片段简化
    if (!keepDependenciesWithProvidedScope) {
        // 移除所有 provided 作用域的依赖
        dependencies.removeIf(d -> "provided".equals(d.getScope()));
    }
}

这意味着:

  • keepDependenciesWithProvidedScope=true :保留 provided 依赖在精简 POM 中
  • keepDependenciesWithProvidedScope=false(默认) :从精简 POM 中移除 provided 依赖

三、配置示例:眼见为实

场景描述

假设项目依赖如下:

xml 复制代码
<dependency>
    <groupId>org.example</groupId>
    <artifactId>lib-d</artifactId>
    <version>1.0</version>
    <scope>provided</scope>
</dependency>

配置对比

配置项 生成的 dependency-reduced-pom.xml
createDependencyReducedPom=true keepDependenciesWithProvidedScope=false 默认 移除 lib-d 依赖
createDependencyReducedPom=true keepDependenciesWithProvidedScope=true 特殊需求 保留 lib-d 依赖

四、常见误解澄清

误解 1:控制 JAR 打包内容

真相 :该参数 不控制依赖是否被打包到 JAR ,仅影响 dependency-reduced-pom.xml 的内容。 provided 依赖不会被shade插件打包到JAR。

误解 2:与 minimizeJar 相关

真相 :与 minimizeJar 参数无关。两者分别控制:

  • minimizeJar:优化 JAR 文件大小
  • keepDependenciesWithProvidedScope:控制精简 POM 的依赖范围

五、正确使用姿势

适用场景

当你的项目需要:

  1. 生成 dependency-reduced-pom.xml
  2. 保留 provided 依赖在精简 POM 中(例如:下游项目需要知道这些依赖的存在)

配置模板

xml 复制代码
<configuration>
    <createDependencyReducedPom>true</createDependencyReducedPom>
    <keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope>
    <!-- 其他配置 -->
</configuration>

六、总结

keepDependenciesWithProvidedScope 是一个典型的 "文档描述 < 源码真相" 案例。其核心要点:

  1. 仅当 createDependencyReducedPom=true 时生效
  2. 仅影响生成的 POM 文件,不控制 JAR 打包
  3. 用于保留 provided 依赖在精简 POM 中的元数据

下次遇到这个参数时,请记住:它只是 POM 文件的管家,不是 JAR 打包的搬运工。


参考资料


  1. 《keepDependenciesWithProvidedScope》 ↩︎

  2. ShadeMojo.java ↩︎

相关推荐
猫头虎7 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
凯尔萨厮13 小时前
Maven(Windows下载安装)
笔记·maven
亓才孓19 小时前
[Maven]Maven基础
java·maven
我真会写代码2 天前
SSM(指南一)---Maven项目管理从入门到精通|高质量实操指南
java·spring·tomcat·maven·ssm
vx1_Biye_Design2 天前
基于Spring Boot+Vue的学生管理系统设计与实现-计算机毕业设计源码46223
java·vue.js·spring boot·spring·eclipse·tomcat·maven
qq_336313933 天前
javaweb-maven单元测试
java·开发语言·maven
计算机毕设指导63 天前
基于微信小程序的校园二手交易系统【源码文末联系】
java·spring boot·spring·微信小程序·小程序·tomcat·maven
多多*4 天前
2026年最新 测试开发工程师相关 Linux相关知识点
java·开发语言·javascript·算法·spring·java-ee·maven
lang201509284 天前
Tomcat Maven插件:部署与卸载的架构设计
java·tomcat·maven
lang201509284 天前
Tomcat Maven插件全解析:开发部署一体化
java·tomcat·maven