关于maven项目依赖冲突的解决

今天在admin项目进行junit测试的时候,产生了一点问题,虽然之前就产生过,但是并没有在意,今天花了点时间解决了下,记录下来,为以后做铺垫。

在运行junit的时候,报了如下的错误:

Exception in thread "main" java.lang.NoSuchFieldError: WRITE_BIGDECIMAL_AS_PLAIN
    at org.redisson.codec.JsonJacksonCodec.(JsonJacksonCodec.java:48)
    at org.redisson.Config.(Config.java:44)
    at org.redisson.Redisson.create(Redisson.java:85)

从错误类型可以看出,是Redisson项目的Jackson包出现了问题,Redisson项目中使用了Jackson包的SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN而现有的以来并不存在该域造成的。
google的时候,均说明是maven项目的依赖冲突造成的。也是,SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN是从Jackson包2.2之后才出现的(Javadoc),如果Maven以来冲突最终获得的包是2.2版本之前那么就是产生这样的错误。
按照这个思路,这个问题应该就很容的解决了,只需要更新Maven的pom文件即可。但是当我们查看Maven的依赖关系时,如下所示:
关于maven项目依赖冲突的解决_第1张图片
可见,项目使用的jackson-databind(报错的数据类型即是在这个包里)已经是2.3.3的版本,然而还是报了错误。
最后尝试的解决方案是:写出报错的类SerializationFeature,点进类后发现跳转到如下的jar包中:
跳转
于是进到这个包中一看,发现了问题所在。这个包中集合了许多常用的jar包中所包含的类,其中包括jackson。jar包中部分内容如下:
关于maven项目依赖冲突的解决_第2张图片
可见,其中包含了Jackson包中的内容,而进入jar包的pom文件中看到,该jackson的版本2.1.1。
当然,我们在项目中包含了2.3.3版本的jackson包,但是2.3.3版本的jackson包在pom文件中的位置要晚于该包,由于两个包中的包同名,均为com.fasterxml.jackson.databind,所以采用就近原则,2.1.1版本的jackson由于出现的更早,则被采用。所以最后的解决方案也就出现了,只要更换一下这两个包的位置即可。
在提前了pom文件中jackson包的位置后,该问题也就迎刃而解。

在项目引用的资源多的时候,maven的以来冲突是个不得不面对的问题,以后有新的问题后会随时补充。

你可能感兴趣的:(maven)