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
相关产品推荐
相关产品推荐

