欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spark gson 运行和编译版本冲突的处理办法

程序员文章站 2022-03-26 16:38:23
问题spark调用gson的方法,运行时抛出NoSuchMethod异常。本地编译无问题。查看依赖,程序本身并没有依赖老版本的gson。原因:spark自带gson,版本为2.2.4。spark任务启动时,会优先加载该版本。程序本身编译集成的gson版本不会被加载。如果代码中使用了更高版本的gson才有的方法和特性,就会抛出异常。解决方案方法1使用和spark版本相同的gson,即2.2.4。优点:不会再报该异常。缺点:无法使用新版本的gson,一些方法和特性都无法使...

问题

  1. spark调用gson的方法,运行时抛出NoSuchMethod异常。
  2. 本地编译无问题。
  3. 查看依赖,程序本身并没有依赖老版本的gson。

原因

  1. spark自带gson,版本为2.2.4。spark任务启动时,会优先加载该版本。程序本身编译集成的gson版本不会被加载。
  2. 如果代码中使用了更高版本的gson才有的方法和特性,就会抛出异常。

解决方案

方法1

使用和spark版本相同的gson,即2.2.4。

优点:

  1. 不会再报该异常。

缺点:

  1. 无法使用新版本的gson,一些方法和特性都无法使用。
  2. 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>

优点:

  1. 能够解决gson版本冲突的问题。
  2. 能够使用高版本的gson。

缺点:

  1. 抛出异常时,异常对应的package是修改之后的。排查问题的时候需要注意。

本文地址:https://blog.csdn.net/WLFIGHTER/article/details/112251726

相关标签: spark gson