Java依赖不同版本冲突解决方案之shade包

我们在很多场景下会碰到java包冲突的问题:

  • 代码由第三方开发,无法对包名或依赖做管控
  • 跑在同一个进程里的代码,更新步调不一致。比如底层sdk,jvm agent。这些组件更新频率较低

最出名的解决路数还是类加载机制,诸如flink,osgi都给我们提供了很多方案,这些方案都非常重型。在代码可信任的情况下,其中有一个很轻量级的解决方案就是maven-shade包。

举个例子,比方说我想在java agent中打印日志,但是又不希望和业务代码中的log4j等冲突,agent里依赖的pom文件是这样子的:

 
        
            org.slf4j
            slf4j-api
            1.7.30
        
        
            org.apache.logging.log4j
            log4j-api
            2.13.3
        
        
            org.apache.logging.log4j
            log4j-core
            2.13.3
        
        
            org.apache.logging.log4j
            log4j-slf4j-impl
            2.13.3
        
        
            org.apache.logging.log4j
            log4j-jcl
            2.13.3
        
    

这里我们log4j,slf4j可能用的版本太高或者太低,我们就可以通过打shade包的方式修改log4j和slf4j的包名,避免和业务冲突


                org.apache.maven.plugins
                maven-shade-plugin
                3.2.4
                
                    
                        package
                        
                            shade
                        
                        
                            
                                
                                    org.slf4j:slf4j-api
                                    org.apache.logging.log4j:log4j-api
                                    org.apache.logging.log4j:log4j-core
                                    org.apache.logging.log4j:log4j-slf4j-impl
                                    org.apache.logging.log4j:log4j-jcl
                                
                            
                            
                                
                                    *:*
                                    
                                        META-INF/*.SF
                                        META-INF/*.DSA
                                        META-INF/*.RSA
                                    
                                
                            
                            
                                
                                    org.slf4j
                                    com.github.shoothzj.org.slf4j
                                
                                
                                    org.apache.logging
                                    com.github.shoothzj.org.apache.logging
                                
                            
                        
                    
                
            

通过上面的配置,artifactSet选择要修改的pom依赖,通过relocation修改包名,达到不冲突的效果。mvn clean package 后查看效果

image-20201230145531225

可以发现,包名已经被修改完成,达到了避免冲突的目的。

你可能感兴趣的:(Java依赖不同版本冲突解决方案之shade包)