首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4j embedded抛出IllegalArgumentException: Config与设置“unsupported.dbms.lucene.ephemeral”没有关联

Neo4j embedded抛出IllegalArgumentException: Config与设置“unsupported.dbms.lucene.ephemeral”没有关联
EN

Stack Overflow用户
提问于 2020-02-06 22:28:43
回答 2查看 332关注 0票数 5

我目前正在开发一个带有嵌入式neo4j数据库的java应用程序(使用maven)。我跟踪了官方指南,也看了github实例

我的代码现在看起来如下:

代码语言:javascript
复制
import org.neo4j.dbms.api.DatabaseManagementService;
import org.neo4j.dbms.api.DatabaseManagementServiceBuilder;
import org.neo4j.graphdb.*;

import static org.neo4j.configuration.GraphDatabaseSettings.DEFAULT_DATABASE_NAME;

public class GraphDatabase {

    private DatabaseManagementService managementService;
    private GraphDatabaseService databaseService;

    public void start(String dir) {
        managementService = new DatabaseManagementServiceBuilder(new File(dir)).build();

        databaseService = managementService.database(DEFAULT_DATABASE_NAME);
    }
...
}

在pom.xml中,我包括:

代码语言:javascript
复制
<dependency>
   <groupId>org.neo4j</groupId>
   <artifactId>neo4j</artifactId>
   <version>4.0.0</version>
</dependency>
...
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.2.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>{myPackageHere}.App</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

在Intellij中运行时没有问题,但是当我用mvn package编译并使用java -jar <name>.jar执行时,会得到以下异常:

代码语言:javascript
复制
java.lang.IllegalArgumentException: Config has no association with setting: 'unsupported.dbms.lucene.ephemeral'
        at org.neo4j.configuration.Config.getObserver(Config.java:635)
        at org.neo4j.configuration.Config.set(Config.java:653)
        at org.neo4j.dbms.api.DatabaseManagementServiceBuilder.newDatabaseManagementService(DatabaseManagementServiceBuilder.java:83)
        at org.neo4j.dbms.api.DatabaseManagementServiceBuilder.build(DatabaseManagementServiceBuilder.java:78)

我在linux和windows上都尝试了这一点,但也有相同的例外。

有人知道我的问题是什么吗?

更新:

我删除了maven程序集插件。如果我像这样编译并运行projekt,它会工作:

代码语言:javascript
复制
mvn compile
mvn exec:java -Dexec.mainClass={myPackageHere}.App

但我还是会准备一个罐子..。

EN

回答 2

Stack Overflow用户

发布于 2020-03-26 19:41:59

当我试图为一个包含Neo4j作为嵌入式数据库的项目创建一个uber-jar时,我遇到了同样的异常。在这一点上,我也使用了maven程序集插件。

我找到的解决方案是使用maven-阴影插件,并在插件的配置中包括一个ServicesResourceTransformer

在我的pom.xml中,maven阴影插件的条目如下所示:

代码语言:javascript
复制
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.2.2</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <manifestEntries>
              <mainClass>{myPackageHere}.App</mainClass>
            </manifestEntries>
          </transformer>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
        </transformers>
        <filters>
          ...
        </filters>
      </configuration>
    </execution>
  </executions>
</plugin>

我使用mvn clean package命令构建jar文件。通过java -jar <name>.jar执行jar给了我与从IDE运行应用程序完全相同的结果,并且没有抛出上面的异常。

一些附加的上下文:maven阴影插件的输出清楚地表明,多个Neo4j依赖项打算在jar的META-INF/services目录中包含重叠的服务。

代码语言:javascript
复制
[WARNING] neo4j-configuration-4.0.2.jar, neo4j-dbms-4.0.2.jar, neo4j-fulltext-index-4.0.2.jar, neo4j-kernel-4.0.2.jar, neo4j-ssl-4.0.2.jar define 1 overlapping resources: 
[WARNING]   - META-INF/services/org.neo4j.configuration.SettingsDeclaration

据我的理解,maven阴影插件将只保留它在执行过程中所看到的相应资源的最后一个实例。ServicesResourceTransformer将通过追加资源内容来聚合资源。

票数 4
EN

Stack Overflow用户

发布于 2022-11-07 15:05:50

我有一个非常类似的bug,经过几个小时的调试,我找到了一个修复程序。我想对你来说也是一样的。

问题

这个问题与服务加载有关,这是我以前不知道的一个特性。为了保持“可插拔性”,neo4j动态地加载其许多服务,方法是声明一个描述“服务”的接口,并使用在运行时标识的几个“服务提供者”来实现它。这是Java项目中的相当常见的模式

一个例子是接口org.neo4j.configuration.SettingsDeclaration,它在neo4j项目中的各种包中都有实现,包括org.neo4j.configuration.GraphDatabaseSettings,这是配置任何图形数据库所必需的。当从本地构建(在您的情况下,您的IDE)运行时,所有这些都可以在类路径中找到,并且一切正常。但是,当从可执行的jar运行时,我们需要在一个名为META-INF/services/org.neo4j.configuration.SettingsDeclaration的文件中显式地声明它们,每一行都声明它们。

问题的出现是因为maven-assembly-plugin相当愚蠢地复制这些services/文件,而来自一个包的声明服务可以覆盖来自另一个包的服务。对我来说,这意味着只加载了SettingsDeclaration的一个实现,其中应该有15个。这会导致事情以神秘的方式失败,当您试图创建数据库时会出现无用的错误消息。

解决方案

如果两个名称相同的services/*文件存在于不同的导入包中,则需要合并它们而不是覆盖它们。幸运的是,maven-assembly-plugin有这样一个特性:metaInf-services处理程序。我们需要配置插件来使用这个处理程序。

您的pom.xml在插件的配置中包含以下元素:

代码语言:javascript
复制
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>

这是告诉插件使用预定义的jar-with-dependencies描述符,它完成了我们想要的大部分工作。但是为了得到我们想要的行为,我们需要创建我们自己的描述符。

将上面的descriptorRefs元素替换为以下内容:

代码语言:javascript
复制
                    <descriptors>
                        <descriptor>src/assembly/my-jar-descriptor.xml</descriptor>
                    </descriptors>

这是告诉插件在src/assembly/my-jar-descriptor.xml中查找它可以用来构建jar的描述符。您应该创建这样一个文件,其内容如下:

代码语言:javascript
复制
<!-- Based on jar-with-dependencies, one of the defaults available in Maven -->
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.1"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.1 https://maven.apache.org/xsd/assembly-2.1.1.xsd">
    <id>complete</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>

    <!-- This element added to make sure files in META-INF/services are merged from all packages. -->
    <containerDescriptorHandlers>
        <containerDescriptorHandler>
            <handlerName>metaInf-services</handlerName>
        </containerDescriptorHandler>
    </containerDescriptorHandlers>
</assembly>

这与jar-with-dependencies的定义相同,您可以在Maven网站上找到它。但是,我们在底部添加了一个containerDescriptorHandlers元素,它告诉插件使用metaInf-services处理程序。这意味着插件将合并services文件而不是覆盖它们,因此neo4j应该可以访问它所需的所有配置内容,即使是从jar加载时也是如此。

我希望这对你有用。在无数个小时的调试和质疑我的人生选择之后,我(一位Maven新手)觉得这是一个奇迹。

我想知道为什么默认情况下这种行为不包括在jar-with-dependencies中。这似乎是无害的,而且会给我省下很多麻烦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60104512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档