Maven打包项目时有关shadding问题的解决

一、问题引入

在Bukkit插件开发中,同一个服务器下加载的所有插件都是类共享的,如果两个不同的插件都使用相同的命名空间,或者是两个插件都引用了同一个依赖并且没有进行依赖包的重定向,那么很可能在服务器加载插件时引发一些错误。
例如:

  • 插件A原意上是要使用某个类的1.0版本,而插件B原意是要使用某个类的2.0版本,但是由于这两个类在命名空间上是相同的,并且类名也相同,这样很肯能导致插件B调用了1.0版本的类,而1.0版本的类中可能相比2.0缺少一些方法,这样一来就会引发NoMethodExpection等异常。

二、解决方案

在Pom.xml里进行配置,调用编译器中的shadding插件来对打包过程进行人为更改,将原本的依赖包重定向到项目命名空间内,从而避免类加载冲突。

例如:现在项目空间为net.dxzzz.team,但是打包了一个co.aikar.db的依赖包,现在它处于项目的命名空间之外,如果其他插件也这么做,那么在这两个插件同时加载的情况下可能发生类加载冲突。(如果没有发生冲突,那只是侥幸,可能这两个插件恰好都使用了同一个版本的类,但并不意味着这种做法可取)

为避免这种情况,我现在在pom.xml里添加打包规则,对co.aikar.idb包进行重定向

打包后可以看到,idb包已经被放置在了team目录下

三、补充说明

在本人使用shadding打包依赖时曾遇到过如下问题

看日志栏可以发现是在shadding过程中发生的

经查阅资料发现,这是由于所引用的依赖中有java16编译的类,而本人打包项目时使用java8的shading插件进行编译,导致无法解析类从而引发报错

理论上有两种解决办法:

  • 1、降低依赖版本,选用java8编译的依赖
  • 2、升级shadding插件

    换用3.5.0进行编译即可
posted @ 2025-01-22 20:37  wyuu101  阅读(46)  评论(0)    收藏  举报