在我当前的项目中,Neo4j中的lucene-core-3.6.2与lucene-core-4.3.1冲突

时间:2014-09-21 21:30:42

标签: lucene neo4j dependencies

我在项目中使用Lucene 4.x.,需要Lucene-core-4.3.1。最近我开始探索Neo4j数据库来维护我的数据图。 lucene-core-3.6.2 jar与neo4j-community-2.1.4捆绑在一起,当我将两个jar添加到我的项目中时,我得到了异常。

Severe:   Exception while loading the app
Severe:   Undeployment failed for context /ibet
Info:     file:/home/caleb/NetBeansProjects/qualebs/build/web/WEB-INF/classes/_ibetPU logout successful
Severe:   Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.NoSuchFieldError: LUCENE_43

我的代码中抛出此异常的第一个地方是

private static final StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);

以及我尝试拨打Version.LUCENE_43

的任何其他地方

我正在开发netbeans并根据Include Neo4j in your project上的说明我需要复制所有jar或将它们从netbeans添加到我的项目中。 JDK 8,Java EE 7 Glassfish 4.0。我所做的所有研究,包括herehere,使我得出结论,我没有简单的方法在同一个JVM中使用两个版本的jar。我唯一的选择是使用lucene 3.x而不是4.x或者只是推迟实现我的项目的图形数据库,直到neo4j与lucene-core的未来版本兼容。所以我问这些是否真的是唯一的选择?如何在不运行两个jvms或每个使用类加载器的情况下使用两个jar?

与此同时,我尝试从我的项目中排除lucene-core-3.6.2,然后在我的ContextListener类中尝试下面的代码来加载类org.apache.lucene.document.Fieldable - 这是引发NoClassDefFoundError的类。

 @Override
public void contextInitialized(ServletContextEvent sce) {
    final ServletContext context = sce.getServletContext();
    try {
        URL[] urls;
        URL url = new URL("file://" + context.getRealPath("/"));
        URI resolve = url.toURI().resolve("../../../" + "jars/neo4j-community-2.1.4/lucene-core-3.6.2.jar");
        urls = new URL[]{resolve.toURL()};
        URLClassLoader loader = URLClassLoader.newInstance(urls);
        loader.loadClass("org.apache.lucene.document.Fieldable");

    } catch (MalformedURLException | URISyntaxException | ClassNotFoundException ex) {
        Logger.getLogger(ContextListener.class.getName()).log(Level.SEVERE, null, ex);
    }
    Neo4JDAO.createGraphDbConnection(context.getRealPath("/") + "/graph/");        
}

但我仍然有例外。我很困惑如何加载这个类,以便它可以从ContextListener的ContextInitialized方法中的任何地方访问?

Caused by: java.lang.RuntimeException: Error starting org.neo4j.kernel.EmbeddedGraphDatabase, /home/caleb/NetBeansProjects/qualebs/build/web/graph

Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.extension.KernelExtensions@1d202bd' failed to initialize. Please see attached cause exception.
    at
Caused by: java.lang.ClassNotFoundException: org.apache.lucene.document.Fieldable
    at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1761)
    at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1611)
    ... 61 more

1 个答案:

答案 0 :(得分:0)

如果你想在嵌入式模式下使用Neo4j,我没有看到任何方法在没有使用正确的类加载器分离的情况下执行此操作。

您是否考虑过在服务器模式下使用Neo4j并使用transactional Cypher endpoint(或JDBC driver)依赖您的应用程序与数据库进行通信?通过这种方式,您可以在应用程序中完全自由选择和依赖。