最近和某第三方平台技术对接时, 由于对方的 restful api 还不完善, 于是被迫选择了sdk方式.
果然, 在使用SpringBoot集成sdk时, 遇上了让人头疼的jar包冲突.
对方的核心jar包依赖了gson-2.2.4.jar, 与SpringBoot自己所依赖的高版本gson发生冲突, 导致SpringBoot在低版本的gson下启动失败:
Caused by: java.lang.NoSuchMethodError: com.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder;
开始解决冲突...
首先, 在pom下排除了第三方公司依赖的gson-2.2.4.jar, SpringBoot可以正常启动了. 但是, 对方sdk在高版本的gson下也无法运行:
Caused by: java.lang.ClassNotFoundException: com.google.gson.JsonObject;
于是, 又想着去降低SpringBoot的版本, 进而降低其依赖的gson版本, 最后发现最老的SpringBoot1.4所依赖的gson都达到了2.7, 此路不通.
此时, 好像只能联系第三方公司了, 让对方把gson升级一下然后重新打jar包发过来.
待定...
期间一直纳闷一个问题: “springboot默认使用jackson的json库, 为什么启动时还要用gson?”
最后, 经人点拨, 得以解惑: springboot确实没用gson, 但是启动时会自动装配它, 以备用.
如果你不用, 可以通过exclude排除自动装配, 如下方式:
@SpringBootApplication(exclude = {GsonAutoConfiguration.class})
SpringBoot启动时装配了很多类, 详见spring-boot-autoconfigure-2.x.x.RELEASE.jar , 对于不用的, 可排除之.