【发布时间】:2018-11-15 09:36:36
【问题描述】:
我正在使用 Spring Boot 来实现 spark 应用程序。我构建了一个 uber jar,并使用 spark-submit 来执行应用程序。但我得到了以下异常:
18/06/05 15:32:37 错误 SpringApplication:应用程序运行失败 org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名称为“gsonBuilder”的bean时出错 [org/springframework/boot/autoconfigure/gson/GsonAutoConfiguration.class]: 通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [com.google.gson.GsonBuilder]:工厂方法 'gsonBuilder' 抛出异常;嵌套异常是 java.lang.BootstrapMethod
错误:java.lang.NoSuchMethodError:com.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder; 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:587) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1254) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1103) .....
即使我在pom.xml 中添加了以下依赖项,异常仍然存在:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
<scope>compile</scope>
</dependency>
如何解决这个依赖问题?
【问题讨论】:
-
检查您的 mvn 依赖关系:树以验证您没有获得多个 gson 库。
-
你打电话给
setLenient吗?如果是这样,您可能想要检查构建中实际使用的版本,spring-boot 的依赖管理有时会覆盖依赖版本,并且可能会放置一个还没有/不再具有此方法的版本。如果您不调用该方法,它可能是引导的自动配置代码,在这种情况下,您可能很幸运没有输入<version>,因此引导获得了它想要的版本。旁注,boot 到处都使用jackson,也许你也可以用它来代替gson -
我检查了安装的 spark jar 文件夹,发现一个 gson-2.2.4.jar 没有 setLenient 方法。尽管我构建了一个 uber jar,但似乎这个 jar 文件用于运行应用程序。
标签: java spring apache-spark spring-boot