SpringBoot整合JanusGraph遇类找不到错误,求排查方案
SpringBoot连接JanusGraph执行CRUD时出现类找不到错误
我尝试用SpringBoot连接JanusGraph执行CRUD操作,Gremlin Server已在8182端口启动,也试过用绝对路径读取配置文件,但出现以下错误:
java.lang.ClassNotFoundException: org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IoStep java.lang.ClassNotFoundException: org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep
相关代码与配置
1. Maven依赖配置
<dependency> <groupId>org.janusgraph</groupId> <artifactId>janusgraph-core</artifactId> <version>0.5.2</version> </dependency> <dependency> <groupId>org.janusgraph</groupId> <artifactId>janusgraph-berkeleyje</artifactId> <version>0.6.1</version> </dependency> <dependency> <groupId>org.apache.tinkerpop</groupId> <artifactId>gremlin-driver</artifactId> <version>3.2.9</version> </dependency>
2. 业务代码(GraphT类)
@RestController public class GraphT { @GetMapping("/test") String all() { Graph graph = JanusGraphFactory.open("conf/janusgraph-berkeleyje.properties"); GraphTraversalSource g = graph.traversal(); // 添加顶点 g.addV("person").property("name", "bob").property("age", 27).iterate(); // 提交事务 g.tx().commit(); // 查询顶点属性 List<Map<String, Object>> result = g.V().valueMap("name", "age").toList(); // 预期返回值:[{name: ["bob"], age: [27]}] for(Map<String, Object> vertex : result){ // 预期vertex为{name:["bob"], age: [27]} ArrayList<String> names = (ArrayList<String>)vertex.get("name"); // 获取["bob"] ArrayList<Integer> ages = (ArrayList<Integer>)vertex.get("age"); // 获取[27] String name = names.get(0); // 获取"bob" Integer age = ages.get(0); // 获取27 System.out.printf("name: %s, age: %s\n", name, age); } // 查询顶点数量 Long count = g.V().count().next(); System.out.printf("vertex count is %d\n", count); try { graph.close(); } catch (Exception ex) { // 处理异常 } return " some result "; } }
3. JanusGraph配置文件
gremlin.graph=org.janusgraph.core.JanusGraphFactory storage.backend=berkeleyje storage.directory=../db/berkeley
请问是代码或配置文件存在问题,还是需要配置Gremlin Server的yaml文件?
解决方案
出现ClassNotFoundException的核心原因是依赖版本不兼容:
- JanusGraph组件版本不一致:
janusgraph-core用0.5.2,janusgraph-berkeleyje却用0.6.1,两者依赖的TinkerPop版本不匹配 gremlin-driver版本3.2.9与JanusGraph依赖的TinkerPop版本差距过大,导致部分类无法找到
修复步骤:
统一JanusGraph组件版本
把所有JanusGraph相关依赖的版本统一,推荐使用0.6.1(更新更稳定):<dependency> <groupId>org.janusgraph</groupId> <artifactId>janusgraph-core</artifactId> <version>0.6.1</version> </dependency> <dependency> <groupId>org.janusgraph</groupId> <artifactId>janusgraph-berkeleyje</artifactId> <version>0.6.1</version> </dependency>匹配对应TinkerPop版本
JanusGraph 0.6.1依赖的TinkerPop版本是3.4.11,因此gremlin-driver需要同步修改:<dependency> <groupId>org.apache.tinkerpop</groupId> <artifactId>gremlin-driver</artifactId> <version>3.4.11</version> </dependency>代码与配置优化
- 你的代码是直接连接本地JanusGraph存储,并未通过Gremlin Server(8182端口),因此不需要修改Gremlin Server的yaml配置
- 建议用try-with-resources语法自动关闭Graph资源,避免泄漏:
try (Graph graph = JanusGraphFactory.open("conf/janusgraph-berkeleyje.properties")) { GraphTraversalSource g = graph.traversal(); // 业务代码逻辑 g.tx().commit(); } catch (Exception e) { e.printStackTrace(); } - 确认配置文件路径正确,若有路径问题可直接使用绝对路径
内容的提问来源于stack exchange,提问作者Keerthi Hassan
相关产品推荐
相关产品推荐

