我尝试使用Cassandra后端访问Titan图形数据库,并且使用以下代码可以正常工作:
package ch.uzh.ifi.ddis.dm.twhc.clusterhierarchy;
import ch.uzh.ifi.ddis.dm.twhc.clusterhierarchy.persistence.ITreeSerializer;
import ch.uzh.ifi.ddis.dm.twhc.clusterhierarchy.persistence.TitanSerializer;
public class ConnectionOkDriver {
public static void main(String[] args) {
ITreeSerializer serializer = TitanSerializer.getInstance();
if (serializer.dbConnected()) {
System.out.print("connection ok");
} else {
System.out.print("connection NOT ok");
}
}
}
输出(忽略SLF4J错误):
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
connection ok
现在,如果我启动以下主要方法,则会出现
Could not instantiate implementation
错误: package ch.uzh.ifi.ddis.dm.twhc.input;
import ch.uzh.ifi.ddis.dm.twhc.clusterhierarchy.persistence.ITreeSerializer;
import ch.uzh.ifi.ddis.dm.twhc.clusterhierarchy.persistence.TitanSerializer;
public class ConnectionFailsDriver {
public static void main(String[] args) {
ITreeSerializer serializer = TitanSerializer.getInstance();
if (serializer.dbConnected()) {
System.out.print("connection ok");
} else {
System.out.print("connection NOT ok");
}
}
}
输出(再次忽略SLF4J错误):
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" java.lang.ExceptionInInitializerError
at ch.uzh.ifi.ddis.dm.twhc.input.ConnectionFailsDriver.main(ConnectionFailsDriver.java:9)
Caused by: java.lang.IllegalArgumentException: Could not instantiate implementation: com.thinkaurelius.titan.diskstorage.cassandra.astyanax.AstyanaxStoreManager
at com.thinkaurelius.titan.diskstorage.Backend.getImplementationClass(Backend.java:274)
at com.thinkaurelius.titan.diskstorage.Backend.getStorageManager(Backend.java:227)
at com.thinkaurelius.titan.diskstorage.Backend.<init>(Backend.java:97)
at com.thinkaurelius.titan.graphdb.configuration.GraphDatabaseConfiguration.getBackend(GraphDatabaseConfiguration.java:440)
at com.thinkaurelius.titan.graphdb.database.StandardTitanGraph.<init>(StandardTitanGraph.java:67)
at com.thinkaurelius.titan.core.TitanFactory.open(TitanFactory.java:40)
at ch.uzh.ifi.ddis.dm.twhc.clusterhierarchy.persistence.TitanSerializer.<init>(TitanSerializer.java:88)
at ch.uzh.ifi.ddis.dm.twhc.clusterhierarchy.persistence.TitanSerializer.<clinit>(TitanSerializer.java:78)
... 1 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.thinkaurelius.titan.diskstorage.Backend.getImplementationClass(Backend.java:263)
... 8 more
Caused by: java.lang.NoSuchMethodError: com.netflix.astyanax.AstyanaxContext.getClient()Ljava/lang/Object;
at com.thinkaurelius.titan.diskstorage.cassandra.astyanax.AstyanaxStoreManager.<init>(AstyanaxStoreManager.java:166)
... 13 more
如您所见,类
ConnectionOkDriver
和ConnectionFailsDriver
的区别仅在于软件包定义。但是,这两个类包含在不同的Maven模块中(2whc-clustering-impl取决于2whc-cluster-hierarchy-impl)。我想发布我的项目结构的图像,但是我不允许这样做:(。这是图像的链接:https://dl.dropboxusercontent.com/u/48169775/project-structure.png错误发生在
TitanSerializer
的TitanFactory.open(conf)
对象的构造函数中。这是代码: private static final String DB_TYPE = "cassandra";
private static final String DB_IP = "127.0.0.1";
private TitanSerializer() {
Configuration conf = new BaseConfiguration();
conf.setProperty("storage.backend", DB_TYPE);
conf.setProperty("storage.hostname", DB_IP);
this.graph = TitanFactory.open(conf);
.
.
.
}
您是否知道为什么会收到此错误?
最佳答案
问题与分布在多个Maven模块上的依赖关系有关。为了解决这个问题,我将所有依赖项(例如titan-all
)移到了核心的maven模块2whc
中(或者我们怎么称呼它?)。现在,所有其他模块仅依赖于我自己的模块。例如,2whc-clustering-impl
仅依赖于2whc-cluster-hierarchy-impl
,而2whc-cluster-hierarchy-impl
本身对pom完全没有任何依赖关系。但是,eclipse Maven POM编辑器的选项卡有效pom对所有模块都显示了模块自身的依存关系和核心模块2whc
的依存关系。2whc-clustering-impl
的pom:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>2whc</artifactId>
<groupId>ch.uzh.ifi.ddis.dm</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>2whc-clustering-impl</artifactId>
...
<dependencies>
<dependency>
<groupId>ch.uzh.ifi.ddis.dm</groupId>
<artifactId>2whc-cluster-hierarchy-impl</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
2whc-cluster-hierarchy-impl
的pom<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>2whc</artifactId>
<groupId>ch.uzh.ifi.ddis.dm</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>2whc-cluster-hierarchy-impl</artifactId>
...
<dependencies>
</dependencies>
</project>
2whc
的pom:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ch.uzh.ifi.ddis.dm</groupId>
<artifactId>2whc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Two-Way Hierarchical Clustering</name>
...
<modules>
<module>2whc-clustering-api</module>
<module>2whc-clustering-impl</module>
<module>2whc-cluster-hierarchy-impl</module>
<module>2whc-recommendations-impl</module>
</modules>
...
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
</dependency>
<dependency>
<groupId>net.sf.supercsv</groupId>
<artifactId>super-csv</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>net.sf.trove4j</groupId>
<artifactId>trove4j</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.2</version>
</dependency>
<dependency>
<groupId>ch.uzh.agglorecommender</groupId>
<artifactId>inputbeans</artifactId>
<version>0.01</version>
</dependency>
<dependency>
<groupId>com.thinkaurelius.titan</groupId>
<artifactId>titan-all</artifactId>
<version>0.3.2</version>
</dependency>
</dependencies>
<properties>
<testng.version>6.8.5</testng.version>
<slf4j.version>1.6.6</slf4j.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
</project>