Maven依赖版本冲突:使用Spring数据Neo4j和Spring数据JPA的应用

Posted

技术标签:

【中文标题】Maven依赖版本冲突:使用Spring数据Neo4j和Spring数据JPA的应用【英文标题】:Maven dependency version conflict: Application using Spring data Neo4j and Spring data JPA 【发布时间】:2016-12-06 18:17:55 【问题描述】:

这是我的 pom.xml 中的依赖项,

    <dependency>
        <groupId>io.spring.platform</groupId>
        <artifactId>platform-bom</artifactId>
        <!--<version>1.1.4.RELEASE</version> -->
        <version>2.0.7.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    <dependency>
        <!-- Import dependency management from Spring Boot -->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>1.4.0.RELEASE</version>
        <!--<version>1.2.7.RELEASE</version> -->
        <type>pom</type>
        <scope>import</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-releasetrain</artifactId>
        <version>Hopper-SR2</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-neo4j</artifactId>
        <version>4.1.0.RC1</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

以及许多其他依赖项

我的应用程序使用 in-memory-derby(嵌入式配置文件)/mysql(远程配置文件)来存储事务数据,并使用 Neo4j 图形数据库来处理分层数据存储。我的要求是基于 maven 配置文件在远程和嵌入式模式下运行 Neo4j。默认情况下,spring 版本管理器使用旧版本的 Spring-data-neo4j (3.x.x),但嵌入式 Neo4j 支持仅在 4.0.0 版之后可用。当我使用上面显示的配置构建我的应用程序时,我收到如下所示的错误,

// ...exception stacktrace

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'locationRepository': Invocation of init method failed; nested exception is java.lang.AbstractMethodError
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
    ... 57 common frames omitted
Caused by: java.lang.AbstractMethodError: null
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:416)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:206)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:251)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:237)
    at org.springframework.data.neo4j.repository.support.GraphRepositoryFactoryBean.afterPropertiesSet(GraphRepositoryFactoryBean.java:43)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
    ... 67 common frames omitted

我猜这个错误是因为 Spring-data-commons 的版本冲突。有没有办法绕过这个错误?

【问题讨论】:

【参考方案1】:

Hopper-SR2 支持 Spring-data-neo4j 4.1.2。为什么要降级到 4.1.0.RC1?尝试删除以降级或将其显式设置为 4.1.2。

如果您仍然认为您正在获得 3.x 版本,请运行以下代码并查看 3.x 版本中的内容。

mvn dependency:tree -Dverbose -Dincludes=spring-data-neo4j

您可以使用相同的过程来查找与 spring-data-commons 的冲突。只需更改包含参数(或为所有依赖项省略它)。如果发现冲突,请在 pom.xml 中明确包含正确的版本。

【讨论】:

以上是关于Maven依赖版本冲突:使用Spring数据Neo4j和Spring数据JPA的应用的主要内容,如果未能解决你的问题,请参考以下文章

Maven怎么处理引用的jar版本冲突

Maven怎么处理引用的jar版本冲突

如何快速的解决Maven依赖冲突

使用Maven Helper解决Maven插件冲突

使用Maven Helper解决Maven依赖冲突

java maven项目中的库版本冲突