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核心并看看会发生什么。
答案 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
,但我不知道你的情况是否合适。