maven-assembly-plugin 同名类覆盖时遇到的一点问题
背景:
一个maven项目,依赖了一些jar包,我想修改某个jar包里面的某个类(比如: org.abc.classA)。由于它并没有提供很好的拓展入口,我选择投机取巧的方法,在当前项目下新建一个 org.abc.classA 类,实现我自己的逻辑。因为本地classes先于依赖的jar包被加载,同全限定类名只会被加载一次。所以就完成了对 org.abc.classA 类的覆盖。
但是,实际打包后执行却发现加载的依旧是原来的类。
我新建一个demo项目重现一下案件现场。
项目结构:
一个MainClass类,通过mybatis-plus的id生成器获取id并打印。
另一个类 DefaultIdentifierGenerator ,是和mybatis-plus中同全限定类名的类,修改了nextId方法并返回123
pom文件:引入了需要的依赖和 maven-compiler 和 maven-assembly 插件
简而言之,我打包后执行
如果加载的我自己定义的同名类,运行 jar包会输出 123
如果加载的 mybatis-plus 原来的类,则会输出一个雪花id
-
接下来打包: mvn clean package
运行,结果不是123,说明加载的是 mybatis-plus 原来的类
连续试了几次,结果一直是这样。
然后我猜想,如果本地的类预先编译好,再打包可能有所不同
-
再来一次,这次先编译再打包:mvn clean compile && mvn package
运行,结果真就变成123了。试了几次也没啥问题
初步感觉就是 maven-assembly-plugin 插件的问题,因为它就是做项目输出合并的 ,这也很明显是一个合并相关的问题。
现在不用 assembly 插件试试,换成 maven-shade-plugin 插件
pom: 文件改成
-
和前面一样,接下来打包: mvn clean package
运行,结果是123,说明加载的是我自己定义的类
连续试了几次,结果都正确。
-
再来测试先编译再打包:mvn clean compile && mvn package
运行结果也是123