maven引入jar包冲突问题

最近做的个项目要在原工程里引入个二方hqueue的jar包,包里用了hbase的包又引用了Guava11版本,但是原工程里又已经在用Guava18,Guava的11和18版本的API更改很大,比如StopWatch的创建和时间获取,看看这个运行时异常,就是由于加载了高版本Stopwatch类引起的

org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator at org.apache.hadoop.hbase.client... 

类冲突检测方法

  1. tomcat启动参数中加入-verbose:class,启动日志里可以看到没有load的jar包
  2. 执行maven命令检查Jar包版本冲突:mvn -X compile dependency:tree -Dverbose | grep 'omitted for conflict with'
  3. IntelliJ IDEA查找依赖关系,解决jar包冲突 这种方式好像检查不出所有的依赖
  4. 加入maven enforce插件:首先在你的项目中需要添加maven-enforcer-plugin插件,然后在插件中定义自己的rule规则,例如如下配置,再执行maven命令 mvn enforcer:enforce

     1.1
     1.0-alpha-3


        
            
                
                    org.apache.maven.plugins
                    maven-enforcer-plugin
                    1.1.1
                    
                        
                            org.codehaus.mojo
                            extra-enforcer-rules
                            ${extra-enforcer-rules_version}
                        
                    
                
            
        
        
            
                org.apache.maven.plugins
                maven-enforcer-plugin
                
                    
                        
                            true
                            
                                commons-logging
                                org.slf4j:*:(,1.6)
                            
                        
                        
                            print("[INFO] [Alibaba Enforcer Rules] parent-pom ");1==1
                        
                        
                            true
                            
                                junit.*
                                org.junit.*
                                org.w3c.dom.*
                                javax.xml.namespace.*
                                org.apache.axis2.*
                            
                            [ERROR] [Alibaba Enforcer Rules] find DuplicateClasses
                        
                    
                
            
        
    

解决方案

  1. 同个jar包不同版本冲突并且向下兼容,则在引入低版本的包中排除依赖

    
    org.springframework
    spring
    

  1. 如果两个版本不兼容,可以用shade插件重新打成一个新的jar包,替换掉不兼容的类
    插件配置参数:http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html
    pom说明
    
        
            com.x.hbase
            hqueue-client
            0.0.1
        
    

    
        
            
                org.apache.maven.plugins
                maven-shade-plugin
            
        
        
            
                
                    org.apache.maven.plugins
                    maven-shade-plugin
                    3.0.0
                    
                        
                            package
                            
                                shade
                            
                            
                                  
                                false  
                                  
                                false  
                                  
                                true  
                                  
                                true  
                                  
                                false  
                                
                                    
                                        com.google.common
                                        shaded.com.google.common
                                    
                                
                            
                        
                    
                
            
        
    

你可能感兴趣的:(maven引入jar包冲突问题)