You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Neo4j自定义插件中集成Elasticsearch遇VerifyError问题求助

Fixing Neo4j Plugin Startup Error with Elasticsearch Dependency Conflict

The java.lang.VerifyError you're encountering stems from a dependency clash between Elasticsearch's embedded Lucene libraries and Neo4j's own Lucene implementation. Neo4j relies on a specific version of Lucene under the hood, and your Elasticsearch Transport client (6.2.4) pulls in an incompatible Lucene version. When the plugin loads, the JVM detects that Elasticsearch's MatchQueryBuilder is trying to override a method marked as final in Neo4j's Lucene class—violating Java's bytecode verification rules.

Preferred Solution: Switch to Elasticsearch REST Client

The Elasticsearch Transport client is deprecated (and removed in ES 7+), and it’s the primary source of this conflict. The REST client uses HTTP instead of the internal transport protocol, so it avoids bringing in conflicting Lucene dependencies. Here’s how to update your setup:

Step 1: Update Maven Dependencies

Replace your existing Transport client dependency with the REST High Level Client (compatible with ES 6.2.4):

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>6.2.4</version>
    <!-- Exclude transitive Lucene dependencies to prevent conflicts -->
    <exclusions>
        <exclusion>
            <groupId>org.apache.lucene</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- Include required low-level REST client -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>6.2.4</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>6.2.4</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.lucene</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Step 2: Update Connection Code

Replace your Transport client initialization with the REST client:

private ElasticSearchBase() {
    Config config = Config.getInstance();
    String host = config.properties.getProperty(ES_HOST);
    int port = Integer.valueOf(config.properties.getProperty(ES_PORT));

    RestHighLevelClient client = new RestHighLevelClient(
            RestClient.builder(new HttpHost(host, port, "http")));
    
    LOG.info("Connected to Elasticsearch successfully: " + client.toString());
}

(Remember to properly close the client in your plugin's lifecycle methods to avoid resource leaks.)

Alternative Solution: Shade Conflicting Dependencies (If You Must Use Transport Client)

If you need to stick with the Transport client, use Maven’s Shade plugin to "relocate" conflicting Lucene/Elasticsearch packages. This renames the bundled libraries so they don’t collide with Neo4j’s:

Add Maven Shade Plugin to pom.xml

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <relocations>
                            <!-- Move Lucene to a shaded namespace -->
                            <relocation>
                                <pattern>org.apache.lucene</pattern>
                                <shadedPattern>com.yourplugin.shaded.org.apache.lucene</shadedPattern>
                            </relocation>
                            <!-- Move Elasticsearch to avoid secondary conflicts -->
                            <relocation>
                                <pattern>org.elasticsearch</pattern>
                                <shadedPattern>com.yourplugin.shaded.org.elasticsearch</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Rebuild your plugin with mvn clean package—the shaded JAR will contain isolated copies of the conflicting libraries under the renamed packages.

Key Notes

  • Always verify Lucene version compatibility between Neo4j and Elasticsearch. For example, Neo4j 3.5.x uses Lucene 6.6.6, while Elasticsearch 6.2.4 uses Lucene 7.2.1—these versions are incompatible, which triggers the error.
  • The REST client is the long-term recommended approach, as the Transport client is no longer supported in newer Elasticsearch releases.

内容的提问来源于stack exchange,提问作者Darshil Babel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:43:03