贝利信息

如何正确选择 Maven 中需要 Shade 的依赖包

日期:2026-01-05 00:00 / 作者:碧海醫心

maven shade 插件并非默认必需,仅在特定场景(如插件开发、类加载隔离)下才需谨慎使用;判断是否 shade 及选择哪些包,应优先通过依赖调解、版本统一和精简依赖来解决冲突, shade 应是最后手段。

在构建可分发的 Java 应用(尤其是插件型 JAR,如 Bukkit/Spigot 插件、Jenkins 插件或 Fabric Loader 模组)时,“是否 Shade”以及“Shade 哪些包”常令人困惑。核心原则是:Shade 不是常规操作,而是应对特定类加载冲突的防御性策略

✅ 何时真正需要 Shade?

❌ 何时 不应 盲目 Shade?


  
    
      org.apache.commons
      commons-collections4
   

4.4

  com.example
  problematic-lib
  
    
      com.google.guava
      guava
    
  

? 如何确定“该 Shade 哪个包”?(无文档时的实操方法)

当官方未明确建议 relocation 包名时,按以下步骤排查:

  1. 分析冲突根源:运行时抛出 ClassNotFoundException 或 NoClassDefFoundError 时,记录完整类名(如 com.google.common.collect.ImmutableList);
  2. 定位所属依赖:执行 mvn dependency:tree -Dverbose | grep -A5 -B5 "guava",确认该类来自哪个 artifact;
  3. 检查其顶层包结构:下载对应 JAR,用 jar -tf xxx.jar | head -20 查看根目录下的 package 前缀(如 com/google/common/ → pattern 应为 com.google);
  4. 最小化 relocation 范围:仅 relocate 实际冲突的包,而非整个依赖。例如:
    
      com.google.common.
      ${shade.base}.guava.
    

    注意末尾的 .,避免误匹配 com.google.commoner 等无关包。

⚠️ 重要注意事项

总之,Shade 是一把精准手术刀,不是万能胶。先诊断、再调解、最后隔离——这才是稳健交付插件或嵌入式模块的正确路径。