编译警告:transitive dependencies (if any) will not be available

Posted by lili on February 19, 2019

最近测试一个Spring Boot项目发现一个很奇怪的现象,代码在Eclipse可以运行,但是用Maven编译是不能通过单元测试,用”mvn -DskipTests package”可以编译,但是用java -jar运行会抛出异常:”类com/fasterxml/jackson/core/Versioned找不到”。

上网搜索了一下发现这个类应该是在jackson-core里。我的项目依赖了spring-boot-starter-web,按理它会依赖spring-boot-starter-json,然后它又依赖jackson-databind,最后依赖jackson-core。但是jackson-core怎么会不在Spring Boot最终打出的大jar包里呢?我收到加入了jackson-core依赖之后,还是报错,但这次变成了另外一个类不存在。显然哪里出来问题。

通过详细分析maven的log,发现了这样的警告:”The POM for com.fasterxml.jackson.core:jackson-databind:jar:2.9.8 is invalid, transitive dependencies (if any) will not be available,enable debug logging for more details”。难道是这个jar包下载出现问题?于是把~/.m2/repository/com/fasterxml/jackson全删了,让maven重新下载。但是还是不行,出现相同的问题。搞了好久也没搞定,又把log翻来覆去看来一遍,发现”enable debug logging for more details”。于是用mvn -X package打开调试,发现”[FATAL] Non-parseable POM /home/lili/.m2/repository/org/jboss/arquillian/arquillian-bom/1.1.11.Final/arquillian-bom-1.1.11.Final.pom:”。原来是别的java包的问题,把/home/lili/.m2/repository/org/jboss/arquillian整个目录删了,问题解决!

分析原因,可能是网络问题,下载某些jar包出现问题,这些jar不是项目的直接依赖而是间接依赖,因为有问题,所有maven打包的时候会去掉这些jar包,同时打出transitive dependencies (if any) will not be available的警告。因此发现这样的警告时一定不能忽略,要使用mvn -X package打印出具体那个pom或者jar出问题,然后重新下载就好了。

但是为什么在Eclispe里可以运行呢?我怀疑是Eclipse没有java那么严格的检查,而这些有问题的jar并没有马上用到。