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

Java8环境下无法构建Neo4j Hello World示例求助

Java8环境下Neo4j驱动连接失败问题排查

问题背景

需在Java8容器中集成Neo4j功能,但编写的Hello World示例无法连接数据库。同一Neo4j Docker容器在Java11环境下可正常连接。

操作步骤

1. Gradle项目初始化

执行以下命令创建Java应用项目:

gradle init \
--project-name neo-question \
--type java-application \
--package neo.question \
--test-framework junit \
--dsl groovy

2. Build.gradle配置

设置Java8兼容性并引入Neo4j驱动依赖:

plugins {
    id 'application'
}

sourceCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = JavaVersion.VERSION_1_8

repositories {
    jcenter()
}

dependencies {
    testImplementation 'junit:junit:4.13'
    implementation 'com.google.guava:guava:29.0-jre'
    implementation 'org.neo4j.driver:neo4j-java-driver:1.7.6'
}

application {
    mainClass = 'neo.question.App'
}

3. 启动Neo4j测试容器

使用Docker启动Neo4j容器:

docker run \
    --name testneo4j \
    -p7474:7474 -p7687:7687 \
    -d \
    -v $HOME/neo4j/data:/data \
    -v $HOME/neo4j/logs:/logs \
    -v $HOME/neo4j/import:/var/lib/neo4j/import \
    -v $HOME/neo4j/plugins:/plugins \
    --env NEO4J_dbms_security_auth__minimum__password__length=4 \
    --env NEO4J_AUTH=neo4j/test \
    neo4j:latest

4. Java代码实现

参考Neo4j 1.7.6驱动示例编写HelloWorldExample:

package neo.question;

import org.neo4j.driver.v1.*;

import static org.neo4j.driver.v1.Values.parameters;

public class HelloWorldExample implements AutoCloseable{
    private final Driver driver;

    public HelloWorldExample(String uri, String user, String password )
    {
        driver = GraphDatabase.driver( uri, AuthTokens.basic( user, password ) );
    }

    @Override
    public void close() throws Exception
    {
        driver.close();
    }

    public void printGreeting( final String message )
    {
        try ( Session session = driver.session() )
        {
            String greeting = session.writeTransaction( new TransactionWork<String>()
            {
                @Override
                public String execute( Transaction tx )
                {
                    StatementResult result = tx.run( "CREATE (a:Greeting) " +
                                    "SET a.message = $message " +
                                    "RETURN a.message + ', from node ' + id(a)",
                            parameters( "message", message ) );
                    return result.single().get( 0 ).asString();
                }
            } );
            System.out.println( greeting );
        }
    }

    public static void main( String... args ) throws Exception
    {
        try ( HelloWorldExample greeter = new HelloWorldExample( "bolt://localhost:7687", "neo4j", "test" ) )
        {
            greeter.printGreeting( "hello, world" );
        }
    }
}

错误信息

运行代码后抛出连接终止异常:

Jan 10, 2023 11:11:03 AM org.neo4j.driver.internal.logging.JULogger info
INFO: Direct driver instance 1113619023 created for server address localhost:7687
Jan 10, 2023 11:11:04 AM org.neo4j.driver.internal.logging.JULogger info
INFO: Closing connection pool towards localhost:7687
Exception in thread "main" org.neo4j.driver.v1.exceptions.ServiceUnavailableException: Connection to the database terminated. This can happen due to network instabilities, or due to restarts of the database
    at org.neo4j.driver.internal.util.Futures.blockingGet(Futures.java:123)
    at org.neo4j.driver.internal.DriverFactory.verifyConnectivity(DriverFactory.java:349)
    at org.neo4j.driver.internal.DriverFactory.newInstance(DriverFactory.java:95)
    at org.neo4j.driver.v1.GraphDatabase.driver(GraphDatabase.java:141)
    at org.neo4j.driver.v1.GraphDatabase.driver(GraphDatabase.java:124)
    at org.neo4j.driver.v1.GraphDatabase.driver(GraphDatabase.java:99)
    at neo.question.HelloWorldExample.<init>(HelloWorldExample.java:12)
    at neo.question.HelloWorldExample.main(HelloWorldExample.java:43)
    Suppressed: org.neo4j.driver.internal.util.ErrorUtil$InternalExceptionCause
        at org.neo4j.driver.internal.util.ErrorUtil.newConnectionTerminatedError(ErrorUtil.java:50)
        at org.neo4j.driver.internal.async.HandshakeHandler.channelInactive(HandshakeHandler.java:81)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241)
        at org.neo4j.driver.internal.shaded.io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:392)
        at org.neo4j.driver.internal.shaded.io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:357)
        at org.neo4j.driver.internal.shaded.io.netty.handler.ssl.SslHandler.channelInactive(SslHandler.java:1074)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241)
        at org.neo4j.driver.internal.shaded.io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:81)
        at org.neo4j.driver.internal.shaded.io.netty.handler.timeout.IdleStateHandler.channelInactive(IdleStateHandler.java:277)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241)
        at org.neo4j.driver.internal.shaded.io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1405)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248)
        at org.neo4j.driver.internal.shaded.io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:901)
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:813)
        at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
        at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:469)
        at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
        at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
        at org.neo4j.driver.internal.shaded.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:829)

> Task :app:HelloWorldExample.main() FAILED

解决方案

1. 版本兼容性修复

问题核心是Neo4j驱动1.7.6为旧版本,而neo4j:latest(5.x+版本)默认启用的Bolt协议TLS加密标准,旧驱动不支持,导致握手失败。

方案一:匹配Neo4j容器版本
使用与驱动1.7.6兼容的Neo4j 3.x版本启动容器:

docker run \
    --name testneo4j \
    -p7474:7474 -p7687:7687 \
    -d \
    -v $HOME/neo4j/data:/data \
    -v $HOME/neo4j/logs:/logs \
    -v $HOME/neo4j/import:/var/lib/neo4j/import \
    -v $HOME/neo4j/plugins:/plugins \
    --env NEO4J_dbms_security_auth__minimum__password__length=4 \
    --env NEO4J_AUTH=neo4j/test \
    neo4j:3.5.35

方案二:禁用驱动TLS加密
修改HelloWorldExample构造方法,添加加密配置(仅建议测试环境使用):

public HelloWorldExample(String uri, String user, String password )
{
    Config config = Config.build().withEncryptionLevel(Config.EncryptionLevel.NONE).toConfig();
    driver = GraphDatabase.driver( uri, AuthTokens.basic( user, password ), config );
}

2. 修正build.gradle配置

原配置重复设置sourceCompatibility,需补充targetCompatibility确保输出Java8字节码:

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8

内容的提问来源于stack exchange,提问作者Bogdan Oloeriu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:40:20