使用maven替换项目依赖中的字节码

问题描述

我们偶尔会发现一些开源项目的问题,或者出于其他原因,想在某个dependency的代码中加几行或者删除几行来达到目的。
我这里遇到一个dubbo 2.7.3和open feign冲突的问题
参见 Issue https://github.com/apache/dubbo/issues/3990。

这里不能等官方修复这个问题并发布更新时,怎么让项目正确的跑起来呢?

问题思路

第一种

字节码替换技术?使用bytebuddy,javassist, asm?
这些技术的局限性,就是JVM本身不允许 在JVM运行期间提供一个新版本类信息。
那么要么通过 javaagent,instrument, 要么JDWP。

第二种

直接clone 开源项目的源码,然后修改一两行,再重新编译,放在项目内,在配置lib依赖,从dependency中排除此依赖????
这种方式经过测试可行,具体需要的知识有,maven的 scope=provided, spring-boot-maven-plugin的 exclude,例如


    org.springframework.boot
    spring-boot-maven-plugin
    
        
            
                repackage
            
        
    
    
        
            
                org.apache.dubbo
                dubbo
            
        
        true
    

目标就是让项目不会把maven仓库的jar包打到依赖中。

另外还需要将lib下的新编译的jar编译到项目。
这还需要配置resources。比较麻烦。

最后,为了改一两行代码,重新编译整个开源项目,还要改动这么多地方,不值得

第三种

有没有那种maven插件?

答案是有的:maven-shade-plugin和maven-dependency-plugin

这里由于spring-boot-maven-plugin插件内有maven-shade-plugin,而且经过尝试,在额外配置一个maven-shade-plugin之后,需要很多include,exclude,
要不就是导致最后UberJar特别大。

如果项目仅仅是一个单一的jar,那么使用maven-shade-plugin理论上也是可以的,将某个jar的内部给exclude掉。

但是这里仍旧推荐maven-dependency-plugin,简单粗暴不容易出错。

问题解决

  1. 项目中提供ServiceBean的实现
  2. 项目的POM添加如下plugin,不用担心插件打包顺序问题,phase=generate-sources是比较靠前的。
  3. 项目的POM如果用到SpringBoot的spring-boot-maven-plugin插件,还要exclude掉dubbo的artifact。

    org.apache.maven.plugins
    maven-dependency-plugin
    
        
            unpack
            generate-sources
            
                unpack
            
            
                
                    
                        org.apache.dubbo
                        dubbo
                        jar
                        true
                        ${project.build.directory}/classes
                        
                                        **/ServiceBean.class
                        
                    
                
            
        
    

你可能感兴趣的:(使用maven替换项目依赖中的字节码)