maven插件学习(maven-shade-plugin和maven-antrun-plugin插件)

整合spark3.3.x和hive2.1.1-cdh6.3.2碰到个问题,就是spark官方支持的hive是2.3.x,但是cdh中的hive确是2.1.x的,项目中又计划用spark-thrift-server,导致编译过程中有部分报错。其中OperationLog这个类在hive2.3中新增加了几个方法,导致编译报错。这个时候有两种解决办法:

  • 修改spark源码,注释掉调用OperationLog中新增方法的地方,看了下源码一共有好几处需要注释
  • 在spark源码中添加新版本的OperationLog类,打包时候需要替换原先的hive-exec中这些类,否则运行时候可能会加载不到这个类

最终决定使用第二种方法,减少对源码的修改。

OperationLog类打包以后会出现在hive-exec-{version}.jar中,其实要做的事情很简单,就是删除这个jar中的OperationLog类,这里通过maven实现我知道的有如下两种实现办法:

  • 通过maven-shade-plugin进行relocation
  • 通过maven-antrun-plugin解压hive-exec-{version}.jar删除OperationLog相关类再(复制新编译的OperationLog相关类 这部分可以省略,不复制也可以)打包新的hive-exec-{version}.jar

上述两种方法各有优劣

  • 通过shade方法进行relocation后会把原先hive-exec中所有的文件都打包到引入它的jar中,会导致生成的jar比较大,hive-exec自身就34M了。这种处理方法也是开源项目中常用的处理方法
  • 通过antrun解压删除相关类再压缩我目前没见别的项目这么玩过。这个时候可以选择是否将自己写的OperationLog类再打包回hive-exec中,如果不打包别的地方用到这个类就会报错了。

第一种方法的pom中build部分如下

    
        
            
                org.apache.maven.plugins
                maven-dependency-plugin
                3.3.0
                
                    
                        package
                        
                            copy-dependencies
                        
                        
                            ${project.build.directory}/lib
                            
                            hive-exec
                        
                    
                
            
            
                org.apache.maven.plugins
                maven-shade-plugin
                3.2.4
                
                    
                        package
                        
                            shade
                        
                        
                            false
                            
                                
                                    org.apache.hive:hive-exec
                                
                            
                            
                                
                                    org.apache.hive:hive-exec
                                    
                                        META-INF/*.MF
                                        META-INF/*.SF
                                        META-INF/*.DSA
                                        META-INF/*.RSA
                                        org/apache/hadoop/hive/ql/session/OperationLog*
                                    
                                
                            
                        
                    
                
            
        
    

第二种方法的pom中build部分如下

    
        
            
                org.apache.maven.plugins
                maven-jar-plugin
                3.2.0
                
                    
                        
                        default-jar
                        package
                        
                            jar
                        
                    
                
                
                    
                    **/OperationLog*.class
                
            
            
                org.apache.maven.plugins
                maven-dependency-plugin
                3.3.0
                
                    
                        package
                        
                            copy-dependencies
                        
                        
                            ${project.build.directory}/lib
                        
                    
                
            
            
                org.apache.maven.plugins
                maven-antrun-plugin
                1.8
                
                    
                        package
                        
                            run
                        
                        
                            
                                
                                
                                
                                    
                                        
                                    
                                
                                
                                
                                    
                                        
                                    
                                
                                
                                
                            
                        
                    
                
            
        
                

虽然上述两种方法都能达到目的,第一种看着简洁一点,第二种看着操作复杂一点。不过我还是倾向于第二种,首先第二种不会减少和增加包的数量,包体积变化也不会太大,看着也更加符合预期的目的,其次第二种操作完以后看起来很简洁,更加适合强迫症或者代码洁癖患者。

参考链接:

maven-shade-plugin

maven-antrun-plugin

你可能感兴趣的:(java,maven,maven,学习,大数据)