【问题标题】:Neo4j 3.0.x PostingsFormat with name 'BlockTreeOrds' does not exist名称为“BlockTreeOrds”的 Neo4j 3.0.x PostingsFormat 不存在
【发布时间】:2016-06-13 18:53:09
【问题描述】:

我尝试从 Neo4j 2.3 更新到 3.0.1。我可以将数据库作为服务启动,那里没问题。

但是当我尝试构建 Neo4j 可执行文件并运行它时,我发现了一个我无法解决的错误。在 Neo4j 2.x 下,我可以很好地构建可执行文件。以下是我的主要方法:

public class StartDB {
    public static void main(String[] args) {
        new GraphDatabaseFactory()
        .newEmbeddedDatabaseBuilder(Paths.get(args[0]).toFile())
        .loadPropertiesFromFile(args[1])
        .newGraphDatabase();
    }
}

我有一个简单的 POM,有 1 个依赖项: <dependencies> <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j</artifactId> <version>3.0.1</version> </dependency> </dependencies>

命令行参数分别是我的数据库和配置的路径。 下面是这个图实例化错误的堆栈跟踪。

Exception in thread "main" java.lang.RuntimeException: Error starting org.neo4j.kernel.impl.factory.CommunityFacadeFactory, /home/glemmon/UPDB/data/neo4j-3.0.1/data/databases/graph.db
    at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.initFacade(GraphDatabaseFacadeFactory.java:144)
    at org.neo4j.kernel.impl.factory.CommunityFacadeFactory.initFacade(CommunityFacadeFactory.java:40)
    at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.newFacade(GraphDatabaseFacadeFactory.java:108)
    at org.neo4j.graphdb.factory.GraphDatabaseFactory.newDatabase(GraphDatabaseFactory.java:99)
    at org.neo4j.graphdb.factory.GraphDatabaseFactory.lambda$createDatabaseCreator$206(GraphDatabaseFactory.java:88)
    at org.neo4j.graphdb.factory.GraphDatabaseFactory$$Lambda$1/1313922862.newDatabase(Unknown Source)
    at org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:183)
    at test.StartDB.main(StartDB.java:11)
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.impl.storageengine.impl.recordstorage.RecordStorageEngine@5483163c' failed to initialize. Please see attached cause exception.
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.init(LifeSupport.java:415)
    at org.neo4j.kernel.lifecycle.LifeSupport.init(LifeSupport.java:62)
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:98)
    at org.neo4j.kernel.NeoStoreDataSource.start(NeoStoreDataSource.java:502)
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:433)
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:107)
    at org.neo4j.kernel.impl.transaction.state.DataSourceManager.start(DataSourceManager.java:99)
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:433)
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:107)
    at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.initFacade(GraphDatabaseFacadeFactory.java:140)
    ... 7 more
Caused by: java.lang.IllegalArgumentException: An SPI class of type org.apache.lucene.codecs.PostingsFormat with name 'BlockTreeOrds' does not exist.  You need to add the corresponding JAR file supporting this SPI to your classpath.  The current classpath supports the following names: [Lucene50]
    at org.apache.lucene.util.NamedSPILoader.lookup(NamedSPILoader.java:114)
    at org.apache.lucene.codecs.PostingsFormat.forName(PostingsFormat.java:112)
    at org.apache.lucene.codecs.perfield.PerFieldPostingsFormat$FieldsReader.<init>(PerFieldPostingsFormat.java:258)
    at org.apache.lucene.codecs.perfield.PerFieldPostingsFormat.fieldsProducer(PerFieldPostingsFormat.java:341)
    at org.apache.lucene.index.SegmentCoreReaders.<init>(SegmentCoreReaders.java:104)
    at org.apache.lucene.index.SegmentReader.<init>(SegmentReader.java:65)
    at org.apache.lucene.index.ReadersAndUpdates.getReader(ReadersAndUpdates.java:145)
    at org.apache.lucene.index.ReadersAndUpdates.getReadOnlyClone(ReadersAndUpdates.java:197)
    at org.apache.lucene.index.StandardDirectoryReader.open(StandardDirectoryReader.java:99)
    at org.apache.lucene.index.IndexWriter.getReader(IndexWriter.java:435)
    at org.apache.lucene.index.DirectoryReader.open(DirectoryReader.java:100)
    at org.apache.lucene.search.SearcherManager.<init>(SearcherManager.java:106)
    at org.apache.lucene.search.SearcherManager.<init>(SearcherManager.java:76)
    at org.neo4j.kernel.api.impl.index.partition.IndexPartition.<init>(IndexPartition.java:54)
    at org.neo4j.kernel.api.impl.index.AbstractLuceneIndex.open(AbstractLuceneIndex.java:101)
    at org.neo4j.kernel.api.impl.schema.LuceneSchemaIndexProvider.indexIsOnline(LuceneSchemaIndexProvider.java:178)
    at org.neo4j.kernel.api.impl.schema.LuceneSchemaIndexProvider.getInitialState(LuceneSchemaIndexProvider.java:123)
    at org.neo4j.kernel.impl.api.index.IndexingService.init(IndexingService.java:200)
    at org.neo4j.kernel.impl.storageengine.impl.recordstorage.RecordStorageEngine.init(RecordStorageEngine.java:403)
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.init(LifeSupport.java:405)
    ... 16 more

由于我可以使用“bin/neo4j”将数据库作为服务启动,因此我认为 /neo4j-community/3.0.1/lib 下的文件与 Maven 提供的文件之间一定存在差异。我尝试使用 java -cp "/neo4j-community/3.0.1/lib/*" 运行我的可执行文件,但无济于事。任何帮助将不胜感激。

【问题讨论】:

  • 这个问题解决了吗?我也有同样的问题。
  • 不。我仍然无法运行我的代码:(

标签: neo4j


【解决方案1】:

最可能的原因是 Maven 没有将 Lucene jar 文件的 META-INF/services 包含到编译的工件中:

META-INF/services/org.apache.lucene.codecs.PostingsFormat

org.apache.lucene.codecs.blocktreeords.BlockTreeOrdsPostingsFormat
org.apache.lucene.codecs.bloom.BloomFilteringPostingsFormat
org.apache.lucene.codecs.memory.DirectPostingsFormat
org.apache.lucene.codecs.memory.FSTOrdPostingsFormat
org.apache.lucene.codecs.memory.FSTPostingsFormat
org.apache.lucene.codecs.memory.MemoryPostingsFormat
org.apache.lucene.codecs.simpletext.SimpleTextPostingsFormat
org.apache.lucene.codecs.autoprefix.AutoPrefixPostingsFormat

如您所见,这是定义BlockTreeOrdsPostingsFormat 的地方。

您可以通过创建一个shaded jar with a ServicesResourceTransformer 来解决该问题,这会将所有包含的 jar 文件中的所有各种META-INF/services 合并在一起。

        <plugin>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>

                            <!-- add Main-Class to manifest file -->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>...</mainClass>
                            </transformer>

                            <!-- merge META-INF/services -->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>

【讨论】:

    【解决方案2】:

    你的maven依赖不够,改成

    <dependency>
        <groupId>org.neo4j</groupId>
        <artifactId>neo4j-community</artifactId>
        <version>3.0.1</version>
        <type>pom</type>
    </dependency>
    

    更新

    也许添加这个可以解决它:

    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-codecs</artifactId>
        <version>5.5.0</version>
    </dependency>
    

    【讨论】:

    • 我编辑了我的 POM 以匹配您提供的内容,但错误没有改变。
    • 更新我上面的答案,我猜你缺少 lucene-codecs
    • 其实我已经想到了这个并添加了这个依赖。在“mvn clean install”之后,错误没有改变。
    • 我也有同样的问题。为了让 neo4j 运行一个“hello world”程序而处理所有这些愚蠢的问题真是太烦人了。
    【解决方案3】:

    这可能是编码问题吗? 我的构建当前显示完全相同的行为。 它在 Eclipse 中运行得非常好,但是构建一个 jar 文件会删除这个错误。

    我的 src 文件以及所有资源都以 utf8 编码。 我注意到数据库本身以及编译和 jar 将是 ANSI。

    在创建数据库时工作正常。在其上使用事务将完全失败。 我进一步注意到,使用 eclipse 我没有字符集问题,但从 power shell 执行 jar 会显示错误字符。 我还发现了一个空指针异常,在数据库中查找节点时不应该出现空指针异常。

    所有强烈的迹象表明这可能是一个编码问题,因为构建文件本身看起来完美无缺。

    遗憾的是,将我的所有文件转换为 ansi 只是为了看看我的预感是否正确,但这可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2017-05-12
      相关资源
      最近更新 更多