不兼容的 Spring 依赖项(调用 AnnotationRepositoryConfigurationSource 构造函数时出现 NoSuchMethodError)

Posted

技术标签:

【中文标题】不兼容的 Spring 依赖项(调用 AnnotationRepositoryConfigurationSource 构造函数时出现 NoSuchMethodError)【英文标题】:Incompatible Spring dependencies (NoSuchMethodError when AnnotationRepositoryConfigurationSource constructor is called) 【发布时间】:2018-03-26 12:39:02 【问题描述】:

添加持久性后,我无法再启动我的 Spring Boot 应用程序。错误是:

java.lang.NoSuchMethodError: org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource.<init>(Lorg/springframework/core/type/AnnotationMetadata;Ljava/lang/Class;Lorg/springframework/core/io/ResourceLoader;Lorg/springframework/core/env/Environment;Lorg/springframework/beans/factory/support/BeanDefinitionRegistry;)V
at org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport$1.<init>(AbstractRepositoryConfigurationSourceSupport.java:68) ~[spring-boot-autoconfigure-1.5.7.RELEASE.jar:1.5.7.RELEASE]

我将其追踪到 AnnotationRepositoryConfigurationSource 所在的 spring-data-commons 中的变化,并且在 1.13.5 版和 1.13 版中添加了一个额外的构造函数参数。 spring-boot-starter-data-jpa 在 1.5.7 版本中应该使用具有相同构造函数签名的 7.而且我们只使用版本号为 1.5.7 的 Spring Boot 依赖项。

然后我构建了依赖树,奇怪地发现 spring-data-commons 是在 1.13.4 版本,而不是 1.13.7(倒数第三行):

...(snippet)
[INFO] +- com.name.project:project-subproject8:jar:1.0.0-SNAPSHOT:compile
[INFO] |  \- org.springframework.boot:spring-boot-starter-data-jpa:jar:1.5.7.RELEASE:compile
[INFO] |     +- org.springframework.boot:spring-boot-starter-jdbc:jar:1.5.4.RELEASE:compile
[INFO] |     |  +- org.apache.tomcat:tomcat-jdbc:jar:8.5.15:compile
[INFO] |     |  |  \- org.apache.tomcat:tomcat-juli:jar:8.5.15:compile
[INFO] |     |  \- org.springframework:spring-jdbc:jar:4.3.9.RELEASE:compile
[INFO] |     +- org.hibernate:hibernate-core:jar:5.0.12.Final:compile
[INFO] |     |  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile
[INFO] |     |  +- antlr:antlr:jar:2.7.7:compile
[INFO] |     |  +- org.jboss:jandex:jar:2.0.0.Final:compile
[INFO] |     |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |     |  \- org.hibernate.common:hibernate-commons-annotations:jar:5.0.1.Final:compile
[INFO] |     +- org.hibernate:hibernate-entitymanager:jar:5.0.12.Final:compile
[INFO] |     +- javax.transaction:javax.transaction-api:jar:1.2:compile
[INFO] |     +- org.springframework.data:spring-data-jpa:jar:1.11.4.RELEASE:compile
[INFO] |     |  +- org.springframework.data:spring-data-commons:jar:1.13.4.RELEASE:compile
[INFO] |     |  \- org.springframework:spring-orm:jar:4.3.9.RELEASE:compile
[INFO] |     \- org.springframework:spring-aspects:jar:4.3.9.RELEASE:compile
...

上树你可以看到 spring-data-jpa 包含在版本 1.11.4 中,而根据Spring Boot Dependency Appendix,它应该是版本 1.11.7。这似乎导致了错误。但是我们不直接通过我们的 pom 文件依赖 spring-data-jpa

所以我不知道这个旧版本是如何进入依赖树的。 spring-boot-starter-data-jpa的pom不表示任何版本号。

【问题讨论】:

您是否已经尝试通过排除或依赖管理来解决此问题? 当然,排除和明确添加所需的工件版本会有所帮助。但这只是治标不治本。 你能附上你的 pom 的依赖部分吗? 【参考方案1】:

我也遇到了同样的问题,现在解决了!!! 您始终可以从外部依赖项中排除特定的内部依赖项。您已经给出了解决此问题的提示。 根本原因是您很可能针对缺少方法的类的不同版本编译了一个类,而不是您在运行它时使用的版本。 我切换到1.5.7版本的spring boot,所以我只需要添加与spring boot 1.5.7版本兼容的jpa依赖即可。为什么依赖jpa,因为-org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource在spring数据包中。它奏效了

【讨论】:

以上是关于不兼容的 Spring 依赖项(调用 AnnotationRepositoryConfigurationSource 构造函数时出现 NoSuchMethodError)的主要内容,如果未能解决你的问题,请参考以下文章

发现 AnguIar 不兼容的对等依赖项

链接具有不兼容依赖项的库

如何使用 Spring 将依赖项注入 HttpSessionListener?

Maven - 强制使用依赖

Spring Cloud 服务之间调用

调用Consul服务(消费服务)