由于不同.jar文件中的类版本不同,我得到了这个异常:
java.lang.RuntimeException:启动org.neo4j.kernel.EmbeddedGraphDatabase时出错,E:\neo4j网址:org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphicDatabase.java:333)网址:org.neo4j.kernel.EmbeddedGraphDatabase.(EmbeddedGraphDatabase.java:63)网址:org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:92)网址:org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:198)网址:org.neo4j.graphdb.factory.GraphDatabaseFactory.newEmbeddedDatabase(GraphDatabaseFactory.java:69)位于neo4j_lucene.conflict_solver.ConflictSolver.createDb(ConflictSolver.java:55)位于neo4j_lucene.conflict_solver.ConflictSolver.main(ConflictSolve.java:35)
尽管我使用ClassLoader
来解决这个问题,但我还是得到了同样的异常。这是我的代码:
try {
CustomClassLoader ccl = new CustomClassLoader();
Object object;
Class clas;
clas = ccl
.loadClass("org.neo4j.graphdb.factory.GraphDatabaseFactory");
object = clas.newInstance();
graphDb = ((GraphDatabaseFactory) object)
.newEmbeddedDatabase(DB_PATH);
} catch (Exception e) {
e.printStackTrace();
}
自定义类加载器代码:
public class CustomClassLoader extends ClassLoader {
private String jarFile = "C:/Users/RaufA/Desktop/test.jar"; // Path
// to
// the
// jar
// file
private Hashtable classes = new Hashtable(); // used to cache already
// defined classes
public CustomClassLoader() {
super(CustomClassLoader.class.getClassLoader()); // calls the parent
// class
// loader's
// constructor
}
public Class loadClass(String className) throws ClassNotFoundException {
return findClass(className);
}
public Class findClass(String className) {
byte classByte[];
Class result = null;
result = (Class) classes.get(className); // checks in cached classes
if (result != null) {
return result;
}
try {
return findSystemClass(className);
} catch (Exception e) {
}
try {
JarFile jar = new JarFile(jarFile);
JarEntry entry = jar.getJarEntry(className + ".class");
System.out.println(className+".class");
InputStream is = jar.getInputStream(entry);
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
int nextValue = is.read();
while (-1 != nextValue) {
byteStream.write(nextValue);
nextValue = is.read();
}
classByte = byteStream.toByteArray();
result = defineClass(className, classByte, 0, classByte.length,
null);
classes.put(className, result);
System.out.println(">>>>result: " + result);
return result;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
我还能做什么?
您正试图将Neo4j和Lucene放在一个jar中,对吧。
问题是,因为Neo4j使用了旧的Lucene版本。
GraphAware的Alessandro Negro解决了这个问题,你可以在这里找到他的解决方案-https://github.com/graphaware/neo4j-elasticsearch-tests
IMO问题是您使用单个jar启动数据库。您需要确保在类加载器中加载了启动neo4j 所需的所有jar
- 将此项目添加到eclipse->https://github.com/lagodiuk/neo4j-uber-jar.
- 使用
mvn-install
并创建~SNAPSHOT.jar
- 将该
.jar
添加到您的项目中(存在冲突) - 从该项目中删除
neo4j maven dependency