Gradle Neo4j“没有依赖项满足类型类org.Neo4j.kernel.api.index.SchemaIndexProvider”

Gradle Neo4j“没有依赖项满足类型类org.Neo4j.kernel.api.index.SchemaIndexProvider”,gradle,neo4j,Gradle,Neo4j,Neo4j社区2.3.3 Linux Ubuntu 14.04 试图运行一个使用卡夫卡主题的Java应用程序,在查询Neo4j时处理其消息,并将其写入另一个卡夫卡主题 hduser@ubuntu:~$ java -jar gradle1-0.1.0.jar localhost:9092 musicgrp raw-events enriched-events bad-events /home/ubuntu/GeoLiteCity.dat SLF4J: Failed to load class "o

Neo4j社区2.3.3 Linux Ubuntu 14.04

试图运行一个使用卡夫卡主题的Java应用程序,在查询Neo4j时处理其消息,并将其写入另一个卡夫卡主题

hduser@ubuntu:~$ java -jar gradle1-0.1.0.jar localhost:9092 musicgrp raw-events enriched-events bad-events /home/ubuntu/GeoLiteCity.dat
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" java.lang.RuntimeException: Error starting org.neo4j.kernel.impl.factory.CommunityFacadeFactory, /home/hduser/neo4jdb2/data/graph.db
    at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.newFacade(GraphDatabaseFacadeFactory.java:143)
    at org.neo4j.kernel.impl.factory.CommunityFacadeFactory.newFacade(CommunityFacadeFactory.java:43)
    at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.newFacade(GraphDatabaseFacadeFactory.java:108)
    at org.neo4j.graphdb.factory.GraphDatabaseFactory.newDatabase(GraphDatabaseFactory.java:129)
    at org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:117)
    at org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:185)
    at music.StreamApp.main(StreamApp.java:40)
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.NeoStoreDataSource@1d606256' was successfully initialized, but failed to start. Please see attached cause exception.
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:462)
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:111)
    at org.neo4j.kernel.impl.transaction.state.DataSourceManager.start(DataSourceManager.java:112)
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:452)
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:111)
    at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.newFacade(GraphDatabaseFacadeFactory.java:139)
    ... 6 more
Caused by: org.neo4j.kernel.impl.util.UnsatisfiedDependencyException: No dependency satisfies type class org.neo4j.kernel.api.index.SchemaIndexProvider
    at org.neo4j.kernel.impl.util.Dependencies.resolveDependency(Dependencies.java:78)
    at org.neo4j.kernel.impl.util.Dependencies.resolveDependency(Dependencies.java:74)
    at org.neo4j.kernel.NeoStoreDataSource.start(NeoStoreDataSource.java:507)
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:452)
    ... 11 more
这是我的gradle.build,我读了一些关于不让Neo4j罐子进入捆绑包的帖子。。。通过使用-classpath指向它的jar。。。我是Gradle的新手,这有关系吗

apply plugin: 'java'
apply plugin: 'application'
sourceCompatibility = '1.8' 
mainClassName = 'music.StreamApp'
repositories {
    mavenCentral()
}
version = '0.1.0'
dependencies { 
    compile 'org.apache.kafka:kafka-clients:0.9.0.0'
    compile 'com.maxmind.geoip:geoip-api:1.2.14'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.6.3'
    compile 'org.slf4j:slf4j-api:1.7.5'
    compile 'org.neo4j:neo4j:2.3.3'
}
jar { // c
manifest {
    attributes 'Main-Class': mainClassName
}
from {
    configurations.compile.collect {
        it.isDirectory() ? it : zipTree(it)
    }
} {
    exclude "META-INF/*.SF"
    exclude "META-INF/*.DSA"
    exclude "META-INF/*.RSA"
}
}

我怀疑您的jar中没有正确的META-INF/services/org.neo4j.kernel.extension.KernelExtensionFactory文件。在内部,Neo4j使用JVM的ServiceLoader加载其组件

请参阅以查找可能丢失的部分


我认为解决这个问题的正确方法不是改变Gradle的默认jar任务,而是使用一个正确处理META-INF文件的插件。我在使用方面取得了一些良好的经验。

在我的例子中,Neo4j Shell Tools 3.0.3,Gradle 2.13,添加mergeServiceFiles是解决此问题的关键:

plugins { id "com.github.johnrengelman.shadow" version "1.2.3" }

shadowJar {
    classifier = 'fat'
    mergeServiceFiles()
    manifest { attributes 'Main-Class': '...' }
}

不需要指定确切的文件META-INF/…

是的,主索引提供程序位于neo4j lucene索引jar中,因此确保它包含在类路径test1中:手动添加的META-INF/services/org.neo4j.kernel.extension.KernelExtensionFactory下的./src/main/java;在依赖项{}中添加了编译'org.neo4j:neo4j lucene index:2.3.3',并在jar{}中从'/src/main/java'{包括'META-INF/services/org.neo4j.kernel.extension.KernelExtensionFactory'};运行gradle罐子。结果:相同错误。TEST2:TEST1+影子插件,添加了插件{id'java'id'application'id'com.github.johnrengelman.shadow'version'1.2.3'};运行gradle shadowJar。结果:成功!我需要的东西,很好!但是,我必须遵循中概述的语法才能运行此功能