Несовместимые зависимости Spring (NoSuchMethodError, когда вызывается конструктор AnnotationRepositoryConfigurationSource)
Я не могу запустить приложение 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]
Я проследил это до изменений в spring-data-commons, где находится AnnotationRepositoryConfigurationSource, и в версии 1.13.5 был добавлен дополнительный аргумент конструктора, а spring-boot-starter-data использовала версию 1.13.7 с той же сигнатурой конструктора. -jpa в версии 1.5.7. И мы используем только зависимости Spring Boot с версией 1.5.7.
Затем я построил дерево зависимостей и странным образом нашел пружинные данные в версии 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, это должна быть версия 1.11.7. Это кажется причиной ошибки. Но мы не зависим от spring-data-jpa напрямую через наши файлы pom.
Так что я не знаю, как эта старая версия попала в дерево зависимостей. Помпа spring-boot-starter-data-jpa не указывает номера версий.
1 ответ
У меня была такая же проблема, и да, это решено сейчас!!! Вы всегда можете исключить конкретную внутреннюю зависимость из внешней зависимости. Вы уже дали подсказку, чтобы решить эту проблему. Основная причина заключается в том, что вы, скорее всего, скомпилировали класс для другой версии класса, в которой отсутствует метод, отличающийся от той, которую вы используете при его запуске. Я перешел на версию весенней загрузки 1.5.7, поэтому мне просто нужно было добавить зависимость jpa, совместимую с версией весенней загрузки 1.5.7. Почему зависимость jpa, потому что - org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource находится в пакете данных Spring. И это сработало