【问题标题】:How to fix 'java.lang.NoClassDefFoundError: org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource$GraphTraversalSourceStub'?如何修复'java.lang.NoClassDefFoundError:org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource$GraphTraversalSourceStub'?
【发布时间】:2019-06-10 09:54:07
【问题描述】:

我正在尝试使用 TinkerGraph 初始化内存中的图形。

首先,我在上下文 xml 文件中定义了 bean,并尝试初始化 TinkerGraph。

我的目的是对我为形成 gremlin 查询而创建的类进行单元测试,我从这些类中获得的最终查询是字符串的形式,因此为了通过 TinkerGraph 执行它们,我有使用了以下帖子中给出的方法: Get Gremlin query as a String and execute it in java without submitting it to the GremlinServer

我还想知道我采用的方法是否是首选方法,用于在单元测试中运行 gremlin 查询?

以下是我在 pom.xml 中包含的依赖项:

<dependency>
    <groupId>org.apache.tinkerpop</groupId>
    <artifactId>tinkergraph-gremlin</artifactId>
    <version>3.2.4</version>
</dependency>

<dependency>
      <groupId>org.apache.tinkerpop</groupId>
      <artifactId>gremlin-groovy</artifactId>
      <version>3.0.2-incubating</version>
</dependency>

EmbeddedGremlinQueryEngine如下:


import org.apache.tinkerpop.gremlin.driver.Result;
import org.apache.tinkerpop.gremlin.driver.ResultSet;
import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import java.util.List;

public class UcsEmbeddedGremlinQueryEngine implements GremlinEngine{

    private static final Logger logger = LoggerFactory.getLogger(UcsEmbeddedGremlinQueryEngine.class);
    private GraphTraversalSource graphTraversalSource = null;
    private Graph graph = null;
    private ScriptEngine engine = null;
    private Bindings bindings = null;

    public UcsEmbeddedGremlinQueryEngine() {
        graph = TinkerGraph.open();
        graphTraversalSource = graph.traversal();
        engine = new GremlinGroovyScriptEngine();
        bindings = engine.createBindings();
        bindings.put("g", graphTraversalSource);
    }

    public void shutdown() throws Exception {
        if (graph != null){
            graph.close();
        }
        logger.info("TinkerGraph shutdown complete.");
    }

    @Override
    public List<Result> query(String query) {
        List<Result> res = null;
        try {
            ResultSet results = (ResultSet) engine.eval(query, bindings);
            res = results.all().join();

            for (Result r : res) {
                System.out.println("result: " + r + '\n');
            }

        } catch (ScriptException e) {
            e.printStackTrace();
        }
        return res;
    }

    // This function reads the initScript and run them as gremlin queries.
    public synchronized void initialize() {
        logger.debug("Initializing embedded TinkerGraph. This will only take a few seconds....");
        //TODO include the execution of queries as part of initialisation
    }
}

堆栈跟踪如下:

java.lang.NoClassDefFoundError: org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource$GraphTraversalSourceStub
    at org.apache.tinkerpop.gremlin.groovy.loaders.StepLoader.load(StepLoader.groovy:54)
    at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:236)
    at org.apache.tinkerpop.gremlin.groovy.loaders.GremlinLoader.load(GremlinLoader.groovy:28)
    at org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.<init>(GremlinGroovyScriptEngine.java:189)
    at org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine.<init>(GremlinGroovyScriptEngine.java:172)
    at com.intuit.gro.mcsdata.gemlinengine.UcsEmbeddedGremlinQueryEngine.<init>(UcsEmbeddedGremlinQueryEngine.java:28)

EmbeddedGremlinQueryEngine 被定义为 xml 文件中的 bean,当加载 bean 时,我得到错误为 构造函数抛出异常;嵌套异常是 java.lang.NoClassDefFoundError: org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource$GraphTraversalSourceStub

我不明白 GraphTraversalSourceStub 在初始化期间是如何出现的,我找不到任何有关它的信息。 任何帮助将不胜感激。

【问题讨论】:

  • 好吧,NCDFException 有点出乎意料,因为我知道 TinkerPop 中没有名为GraphTraversalSourceStub 的类,但我不知道您的代码的哪一部分试图引用它。也许您应该发布异常的整个堆栈跟踪,并可能更新您的问题以更多地讨论您与此代码一起使用的库?我在图中感觉到了一个 DI 框架?
  • 嗨@stephenmallette 我已经更新了你指出的更多细节的问题,以及我写这门课的目的,如果有更好的方法,请告诉我.

标签: spring gremlin tinkergraph


【解决方案1】:

我认为你的问题是:

  1. 使用非常旧的 TinkerPop 版本
  2. 您使用的旧版本可能不兼容

我不确定您是否有理由使用 3.2.4,但如果有,请确保 gremlin-groovy 也是 3.2.4。请注意,此时 3.2.x 代码行基本上没有维护,最后一个版本是大约 6 个月前的 3.2.11。如果您正在开发一个新应用程序,那么我强烈建议您直接使用几周前发布的最新版本 3.4.2。

至于您的测试方法,我想这很好。如果您有测试 Gremlin 字符串,那么除了使用 Gremlin Server 之外,您真的没有太多其他选择。显然,为GremlinGroovyScriptEngine 提供测试工具要容易得多。

【讨论】:

  • 我实际上是在尝试使用不同的版本,但我得到了同样的错误,我也尝试了你提到的最新版本 3.4.2。
  • 混合/匹配版本几乎从来都不是一个好主意。如果您不知道这些版本如何协同工作,您可能会遇到微妙(或主要)的问题。我在之前的评论中提到了“依赖注入”,现在我看到了“spring”的问题标签。 Spring 是否以某种方式动态地创建它以用于注入目的?比如,如果你忽略 spring 并使用 public static void main(String[] args) 方法创建一个简单的类并实例化这个类会发生什么?课程不涉及弹簧吗?
【解决方案2】:

对于 3.4.0 版,您至少需要以下类路径。

set cp=%cp%;C:\pathToM2Repo\org\apache\tinkerpop\gremlin-core\3.4.0\gremlin-core-3.4.0.jar
set cp=%cp%;C:\pathToM2Repo\org\apache\tinkerpop\gremlin-driver\3.4.0\gremlin-driver-3.4.0.jar
set cp=%cp%;C:\pathToM2Repo\org\apache\tinkerpop\gremlin-groovy\3.4.0\gremlin-groovy-3.4.0.jar
set cp=%cp%;C:\pathToM2Repo\org\apache\tinkerpop\gremlin-server\3.4.0\gremlin-server-3.4.0.jar
set cp=%cp%;C:\pathToM2Repo\org\apache\tinkerpop\gremlin-shaded\3.4.0\gremlin-shaded-3.4.0.jar
set cp=%cp%;C:\pathToM2Repo\org\apache\tinkerpop\tinkergraph-gremlin\3.4.0\tinkergraph-gremlin-3.4.0.jar
set cp=%cp%;C:\pathToM2Repo\org\apache\tinkerpop\tinkerpop\3.4.0\tinkerpop-3.4.0.jar
set cp=%cp%;C:\pathToM2Repo\commons-configuration\commons-configuration\1.10\commons-configuration-1.10.jar
set cp=%cp%;C:\pathToM2Repo\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar
set cp=%cp%;C:\pathToM2Repo\org\apache\logging\log4j\log4j-slf4j-impl\2.11.1\log4j-slf4j-impl-2.11.1.jar
set cp=%cp%;C:\pathToM2Repo\org\apache\logging\log4j\log4j-api\2.11.1\log4j-api-2.11.1.jar
set cp=%cp%;C:\pathToM2Repo\org\apache\logging\log4j\log4j-core\2.11.1\log4j-core-2.11.1.jar
set cp=%cp%;C:\pathToM2Repo\org\codehaus\groovy\groovy\2.5.4\groovy-2.5.4-indy.jar
set cp=%cp%;C:\pathToM2Repo\org\codehaus\groovy\groovy-json\2.5.4\groovy-json-2.5.4-indy.jar
set cp=%cp%;C:\pathToM2Repo\org\codehaus\groovy\groovy-xml\2.5.5\groovy-xml-2.5.5.jar
set cp=%cp%;C:\pathToM2Repo\org\codehaus\groovy\groovy-templates\2.5.5\groovy-templates-2.5.5.jar
set cp=%cp%;C:\pathToM2Repo\org\javatuples\javatuples\1.2\javatuples-1.2.jar
set cp=%cp%;C:\pathToM2Repo\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar
set cp=%cp%;C:\pathToM2Repo\io\netty\netty-all\4.1.31.Final\netty-all-4.1.31.Final.jar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多