整合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部分如下

    <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.3.0</version><executions><execution><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory><!-- shade会包含这个jar的所有类,所以这里直接排除 --><excludeArtifactIds>hive-exec</excludeArtifactIds></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><shadedArtifactAttached>false</shadedArtifactAttached><artifactSet><includes><include>org.apache.hive:hive-exec</include></includes></artifactSet><filters><filter><artifact>org.apache.hive:hive-exec</artifact><excludes><exclude>META-INF/*.MF</exclude><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude><exclude>org/apache/hadoop/hive/ql/session/OperationLog*</exclude></excludes></filter></filters></configuration></execution></executions></plugin></plugins></build>

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

    <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><executions><execution><!--这里id必须为default-jar否则会报错,因为默认执行时候会先执行default-jar,这里用这个id等于是替换掉默认的操作--><id>default-jar</id><phase>package</phase><goals><goal>jar</goal></goals></execution></executions><configuration><!--打包时候排除掉这些类--><excludes>**/OperationLog*.class</excludes></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.3.0</version><executions><execution><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId><version>1.8</version><executions><execution><phase>package</phase><goals><goal>run</goal></goals><configuration><target><echo message="Repackage hive-exec."/><!--解压原先的hive-exec.jar,解压时候直接跳过OperationLog相关的文件--><unjar src="${project.build.directory}/lib/hive-exec-${hive.version}.jar"dest="${project.build.directory}/exploded/hive-exec"><patternset><exclude name="**/OperationLog*.class"/></patternset></unjar><!--将自己编译的OperationLog相关的类复制到解压后的目录中--><copy todir="${project.build.directory}/exploded/hive-exec"><fileset dir="${project.build.directory}/classes"><include name="**/OperationLog*.class" /></fileset></copy><!--重新打包新的hive-exec.jar--><jar destfile="${project.build.directory}/lib/hive-exec-${hive.version}.jar"basedir="${project.build.directory}/exploded/hive-exec"/></target></configuration></execution></executions></plugin></plugins></build>            

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

参考链接:

maven-shade-plugin

maven-antrun-plugin

maven插件学习(maven-shade-plugin和maven-antrun-plugin插件)相关推荐

  1. postgresql|数据库|插件学习(一)---postgresql-12的内置插件pg_stat_statements的启用和使用

    前言:         插件就是原软件的扩展功能.postgresql有非常多的各种各样的插件,当然了,插件不安装对于我们使用数据库并没有什么太多的影响,可能只是不舒服一些而已,但有一些插件我们如果有 ...

  2. Unity游戏编程自学书籍、插件学习与视频教程

    本文主要介绍用Unity进行游戏编程开发的自学书籍.需要学习的插件以及相关视频教程. 由于Unity采用C#进行开发,所以在进行下面的学习之前,确保自己有一定的C#基础并对基础的数据结构与算法有一定的 ...

  3. 转载 ----MAVEN相关学习

    呈顼I渝 Maven的安装.配置及使用入门 本书代码下载  大家可以从我的网站下载本书的代码:http://www.juvenxu.com/mvn-in-action/,也可以通过我的网站与我取得联系 ...

  4. Maven - 10、设计你自己的maven插件

    整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接. Maven默认提供了很多插件,功能也非常强大,但是如果我们想自己开发一些插 ...

  5. Maven学习总结(14)——Maven 多模块项目如何分工?

    2019独角兽企业重金招聘Python工程师标准>>> 一.开场白 使用Maven有段时间了,只能感慨真是个好东西,让我从传统模式体会到了严谨.规范.敏捷.方便的特性. 如果你懂Ma ...

  6. Maven的学习总结

    前言 对maven的学习总结 文章目录 前言 一.Maven是什么? 1.Maven的概念 2.Maven的核心是什么 3.依赖管理的资源来源 4.Maven的功能总结 5.Maven的项目开发结构 ...

  7. Maven学习总结(6)——Maven与Eclipse整合

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(六)--Maven与Eclipse整合 一.安装Maven插件 下载下来的maven插件如下图所示:,插件 ...

  8. Eclipse创建的Maven项目报错Could not calculate build plan: Plugin

    Eclipse创建的Maven项目报错Could not calculate build plan: Plugin 2018年05月10日 21:59:25 TIMI-Nian 阅读数:5040 标签 ...

  9. ideal pom文件安装到maven库中_java学习之web基础(14)Maven基础学习

    maven 介绍 Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM: Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle) ...

  10. SSM框架学习——Maven进阶学习

    her~~llo,我是你们的好朋友Lyle,是名梦想成为计算机大佬的男人! 博客是为了记录自我的学习历程,加强记忆方便复习,如有不足之处还望多多包涵!非常欢迎大家的批评指正. 今天我们进入新的学习环节 ...

最新文章

  1. 统计模型参数量与FLOPs
  2. linux copy_from/to_user原理
  3. 5.2 计算机网络之传输层UDP协议
  4. dubbo forbid service的解决办法
  5. oracle 数据库安装与使用说明(简略版)
  6. vue本地静态图片的路径问题解决方案
  7. FFmpeg示例程序合集-Git批量获取脚本
  8. Centos 7 修改时区
  9. SQL SERVER 之 填充因子
  10. html5通讯录源码,通讯录web版
  11. windows进程 windows多进程编程
  12. not all arguments converted during string formatting
  13. Android闹钟程序
  14. 丰城九中2021高考成绩查询,丰城九中2021届毕业典礼
  15. 貂蝉待你玩转Java王者荣耀
  16. SpreadJS 纯前端表格控件应用案例:金融业数据智能分析平台
  17. Python简单处理excel数据(拆分合并单元格、根据表头合并sheet、添加列数、添加内容操作)
  18. vb6.0连接postgresql 13
  19. 为什么祖传代码被称为“屎山”?
  20. java怎么求偏态函数_偏态分布的均值与中位数关系

热门文章

  1. vue-router浅忆一下
  2. Unix朝代歌《精通Unix下C语言与项目实践》读书笔记(7)
  3. 商务统计_14 统计指数
  4. BMW BENZ AUDI 宝马,奔驰,奥迪维修标准工时,从KSD,WIS, ELSA 中提取。
  5. TopXGun拓攻植保飞控T1-A新品发布会在南京盛大开幕
  6. 怎样用word2007比较两篇文章的差异
  7. 常被忽视的基础PPT功能,也能做出酷炫特效
  8. 广东茂名农林科技职业学院计算机网络技术,广东茂名农林科技职业学院有哪些专业 附好的重点专业名单...
  9. Hanwang汉王笔精简版 20120207官方最新版
  10. githup用户名密码怎么看_最新tplink路由器如何设置密码 tplink路由器设置密码步骤【详解】...