使用Neo4j EmbeddedDriver和Spring Boot& SDN因应用程序启动时出现依赖性问题而失败

时间:2016-08-28 13:28:09

标签: java gradle neo4j lucene spring-data-neo4j

在应用程序上下文初始化时,

Spring Boot无法启动配置了EmbeddedDriver的应用程序。它会引发UnsatisfiedDependencyException,展开它会指向NoClassDefFoundError

Caused by: java.lang.NoClassDefFoundError: org/apache/lucene/document/Fieldable
at org.neo4j.kernel.api.impl.index.NodeRangeDocumentLabelScanStorageStrategy.<init>(NodeRangeDocumentLabelScanStorageStrategy.java:71) ~[neo4j-lucene-index-2.3.6.jar:2.3.6]
at org.neo4j.kernel.api.impl.index.LuceneLabelScanStoreExtension.newInstance(LuceneLabelScanStoreExtension.java:72) ~[neo4j-lucene-index-2.3.6.jar:2.3.6]
at org.neo4j.kernel.api.impl.index.LuceneLabelScanStoreExtension.newInstance(LuceneLabelScanStoreExtension.java:39) ~[neo4j-lucene-index-2.3.6.jar:2.3.6]
at org.neo4j.kernel.extension.KernelExtensions.init(KernelExtensions.java:69) ~[neo4j-kernel-2.3.6.jar:2.3.6,7dc1b59]
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.init(LifeSupport.java:424) ~[neo4j-kernel-2.3.6.jar:2.3.6,7dc1b59]
... 197 common frames omitted

我在Gradle依赖项中也有EmbeddedDriver:

compile 'org.neo4j:neo4j-ogm-embedded-driver:2.0.4'

看起来这个工件需要neo4j:2.3.6(来自Spring Boot启动器的工件附带3.0.x版本),而后者依赖于neo4j-lucene-index:2.3.6并最终引入lucene-core:3.6.2 }。

我检查了其他依赖项,我们的应用程序使用的apache-lucene的实际版本似乎是5.5.0,而后者根本不包含Fieldable接口。最有可能的是它来自Hibernate依赖项(我们也将它用于JPA),因此Gradle解析了较高的一个以进入运行时。

不确定是否有帮助,我按照Java-based configuration设置了EmbeddedDriver:

@org.springframework.context.annotation.Configuration
@Profile("test")
public class TestNeo4jConfig extends Neo4jConfig {

    @Override
    public Configuration getConfiguration() {
        Configuration configuration = new Configuration();
        configuration
                .driverConfiguration()
                .setURI("file:///var/tmp/graph.db");
        return configuration;
    }
}

感谢您对此问题的任何帮助。

更新

来自build.gradle的相关依赖项:

dependencies {
    // Spring Boot
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-data-elasticsearch')
    compile('org.springframework.boot:spring-boot-starter-data-neo4j')
    compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.7.2")

    // JPA
    runtime 'org.postgresql:postgresql'
    compile 'org.jadira.usertype:usertype.extended:5.0.0.GA'
    compile 'org.hibernate:hibernate-java8'

    // OGM
    compile 'org.neo4j.driver:neo4j-java-driver:1.0.4'
    runtime 'org.neo4j:neo4j-ogm-bolt-driver:2.0.4'
    runtime 'org.neo4j:neo4j-ogm-embedded-driver:2.0.4'
}

更新2:

lucene-core:5.5.0的依赖性来自Elasticsearch,或者更确切地说,来自Spring的Spring Boot入门者(因为我们使用ES的Spring Data存储库):

+--- org.springframework.boot:spring-boot-starter-data-elasticsearch: -> 1.4.0.RELEASE
|    +--- org.springframework.boot:spring-boot-starter:1.4.0.RELEASE (*)
|    \--- org.springframework.data:spring-data-elasticsearch:2.0.2.RELEASE
|         +--- org.springframework:spring-context:4.2.6.RELEASE -> 4.3.2.RELEASE (*)
|         +--- org.springframework:spring-tx:4.2.6.RELEASE -> 4.3.2.RELEASE (*)
|         +--- org.springframework.data:spring-data-commons:1.12.2.RELEASE (*)
|         +--- commons-lang:commons-lang:2.6
|         +--- joda-time:joda-time:2.9.4
|         +--- org.elasticsearch:elasticsearch:2.2.0 -> 2.3.4
|         |    +--- org.apache.lucene:lucene-core:5.5.0

我试图排除对lucene-core:5.5.0的这种短暂依赖,正如@ digx1提出的那样,这里没有运气:

Caused by: java.lang.NoSuchFieldError: LUCENE_4_0_0
    at org.elasticsearch.Version.<clinit>(Version.java:44)

版本3.6.2似乎太低了。

将尝试另一种方式将neo4j的依赖性增加到3.0.4核心并看看会发生什么。

2 个答案:

答案 0 :(得分:1)

使用开源库和瞬态依赖项可能是一个令人沮丧的问题。

那你怎么解决这个问题呢?您必须确定lucene-core:5.5.0库的瞬态依赖的来源。您只需在gradle项目的根目录中键入gradle dependencies即可完成此操作。

找到违规依赖后,您需要将其排除。有几种方法可以做到这一点,但以下方式应该没问题。让我们说有问题的jar是hibernate-java8。然后你可以像这样排除瞬态依赖:

compile ('org.hibernate:hibernate-java8') {
    exclude group: "org.apache.lucene", module: "lucene-core"
}

现在,当您重新编译时,将忽略lucene-core的5.5.0版本,并且类加载器现在将使用3.6.2定义的版本。如果排除的jar在编译或运行时由旧版本中不存在的依赖jar所需的代码,则可能会出现问题。如果是这种情况,你就会陷入麻烦之中,可能需要探索重新包装lucene-core的想法或同样激烈的东西。

祝你好运!

答案 1 :(得分:1)

ogm 2.0.4取决于neo4j 2.3.6,这取决于lucene-core 3.6.2

+--- org.neo4j:neo4j-ogm-bolt-driver:2.0.4
|    +--- org.neo4j:neo4j-ogm-api:2.0.4 (*)
|    +--- org.neo4j:neo4j:2.3.6
|    |    +--- org.neo4j:neo4j-kernel:2.3.6
|    |    |    +--- org.neo4j:neo4j-primitive-collections:2.3.6
|    |    |    |    +--- org.neo4j:neo4j-unsafe:2.3.6
|    |    |    |    \--- org.neo4j:neo4j-function:2.3.6
|    |    |    +--- org.neo4j:neo4j-io:2.3.6
|    |    |    |    +--- org.neo4j:neo4j-unsafe:2.3.6
|    |    |    |    +--- org.neo4j:neo4j-primitive-collections:2.3.6 (*)
|    |    |    |    \--- org.apache.commons:commons-lang3:3.3.2 -> 3.4
|    |    |    +--- org.neo4j:neo4j-csv:2.3.6
|    |    |    |    \--- org.neo4j:neo4j-primitive-collections:2.3.6 (*)
|    |    |    \--- org.neo4j:neo4j-logging:2.3.6
|    |    |         \--- org.neo4j:neo4j-io:2.3.6 (*)
|    |    +--- org.neo4j:neo4j-lucene-index:2.3.6
|    |    |    +--- org.neo4j:neo4j-kernel:2.3.6 (*)
|    |    |    \--- org.apache.lucene:lucene-core:3.6.2 -> 5.5.0

你可以从@ digx1的建议开始,你可能会很幸运,不会遇到任何进一步的问题。

我可能会克隆https://github.com/neo4j/neo4j-ogm并构建一个取决于ogm 2.0.5-SNAPSHOT的新neo4j 3.0.4,但我不知道你的情况是否合适。