spark gson 运行和编译版本冲突的处理办法
程序员文章站
2022-06-28 16:13:41
问题spark调用gson的方法,运行时抛出NoSuchMethod异常。本地编译无问题。查看依赖,程序本身并没有依赖老版本的gson。原因:spark自带gson,版本为2.2.4。spark任务启动时,会优先加载该版本。程序本身编译集成的gson版本不会被加载。如果代码中使用了更高版本的gson才有的方法和特性,就会抛出异常。解决方案方法1使用和spark版本相同的gson,即2.2.4。优点:不会再报该异常。缺点:无法使用新版本的gson,一些方法和特性都无法使...
问题
- spark调用gson的方法,运行时抛出NoSuchMethod异常。
- 本地编译无问题。
- 查看依赖,程序本身并没有依赖老版本的gson。
原因
- spark自带gson,版本为2.2.4。spark任务启动时,会优先加载该版本。程序本身编译集成的gson版本不会被加载。
- 如果代码中使用了更高版本的gson才有的方法和特性,就会抛出异常。
解决方案
方法1
使用和spark版本相同的gson,即2.2.4。
优点:
- 不会再报该异常。
缺点:
- 无法使用新版本的gson,一些方法和特性都无法使用。
- gson版本和spark 集成的gson版本绑定,如果后续spark版本升级导致其使用的gson版本发生变动,可能还会出问题。
方法2
使用maven-shade-plugin的relocate功能。该功能将package进行改名成另外一个。程序在运行时,会自动将原package进行改名。
具体方法:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.gson</pattern>
<shadedPattern>shaded.com.google.gson</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
优点:
- 能够解决gson版本冲突的问题。
- 能够使用高版本的gson。
缺点:
- 抛出异常时,异常对应的package是修改之后的。排查问题的时候需要注意。
本文地址:https://blog.csdn.net/WLFIGHTER/article/details/112251726