Как исправить 'java.lang.NoClassDefFoundError: org / apache / tinkerpop / gremlin / process / traversal / dsl / graph / GraphTraversalSource $ GraphTraversalSourceStub'? - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь инициализировать график в памяти, используя TinkerGraph.

Во-первых, я определил bean-компонент в своем XML-файле контекста и попытался инициализировать TinkerGraph.

Мое намерение состоит в модульном тестировании классов, которые я создал для формирования запросов gremlin, конечные запросы, которые я получаю от этих классов, имеют форму строки, поэтому для их выполнения через TinkerGraph у меня есть Используемый подход приведен в следующем посте: Получить запрос Gremlin в виде строки и выполнить его в Java, не отправляя его на 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 определяется как bean-компонент в xml-файле, при загрузке bean-компонента я получаю сообщение об ошибке как Конструктор бросил исключение; Вложенным исключением является java.lang.NoClassDefFoundError: org / apache / tinkerpop / gremlin / process / traversal / dsl / graph / GraphTraversalSource $ GraphTraversalSourceStub

Я не понимаю, как GraphTraversalSourceStub входит в изображение во время инициализации, я не смог найти никакой информации о нем. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 19 июля 2019

Для версии 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
0 голосов
/ 10 июня 2019

Я думаю, что ваша проблема в том, что вы:

  1. с использованием действительно старых версий TinkerPop
  2. старые версии, которые вы используете, вероятно, несовместимы

Я не уверен, есть ли у вас причина для использования 3.2.4, но если это так, убедитесь, что gremlin-groovy также 3.2.4. Обратите внимание, что на данный момент строка кода 3.2.x в основном не поддерживается, а последний выпуск был 3.2.11 около 6 месяцев назад. Если вы разрабатываете новое приложение, я настоятельно рекомендую вам просто использовать последнюю версию 3.4.2, выпущенную несколько недель назад.

Что касается вашего подхода к тестированию, я думаю, это нормально. Если у вас есть тестовые строки Gremlin, то у вас действительно нет другого выбора в этом вопросе, кроме использования Gremlin Server. Очевидно, что обеспечить тестовый комплект для GremlinGroovyScriptEngine гораздо проще.

...