引起:java.lang.NoSuchMethodError:com.datastax.driver.core.TypeCodec.getJavaType()Lcom / google / common / reflect / TypeToken;

时间:2017-11-07 09:10:25

标签: spark-cassandra-connector spring-data-cassandra

我正在使用以下依赖项创建一个应用程序,这是迄今为止的所有最新版本。

     <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.0.0.M5</version>
     </parent>
    `<dependency>
        <groupId>com.datastax.spark</groupId>
        <artifactId>spark-cassandra-connector_2.10</artifactId>
        <version>2.0.5</</version>
     </dependency> 
     <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-core</artifactId>
        <version>3.3.0</version>
     </dependency>`

我得到了这个例外

"Caused by: java.lang.NoSuchMethodError: com.datastax.driver.core.TypeCodec.getJavaType()Lcom/google/common/reflect/TypeToken;"

在做了一些研究后,我发现原因是spark-cassandra-connector_2.10 jar还包含com.datastax.driver类文件,它也有TypeCodeC.class但这与TypeCodeC.class文件不同cassandra-driver-core

到目前为止我有2个解决方案。

  1. 使用maven-shade-plugin从jar中排除类文件。但是,这需要大量额外的工作。出于某种原因,只有我将项目编译为jar并将此jar作为依赖项添加到我的项目中,然后才能工作。我不认为这是一个很好的解决方案
  2. 我直接从jar中删除/com/datastax/driver文件夹和文件。使用此命令

    zip -d /Users/cicidi/.m2/repository/com/datastax/spark/spark-cassandra-connector_2.10/2.0.5/spark-cassandra-connector_2.10-2.0.5.jar /com/datastax/driver/*
    
  3. 它有效!然后你需要将这个jar添加到你的项目中,而不是使用maven。(你可以在你的本地使用maven,但是如果你再次拉动jar就不会工作。)

    我在互联网上找不到任何答案。我知道会有一些聪明人解决这个问题。但在此之前,我发布此答案是为了帮助那些想立即解决这个问题的人。

2 个答案:

答案 0 :(得分:0)

     <dependency>
       <groupId>com.datastax.spark</groupId>
       <artifactId>spark-cassandra-connector_2.10</artifactId>
       <version>2.0.0-M1</version>
     </dependency>

没有版本冲突
       <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-core</artifactId>
            <version>3.3.0</version>
        </dependency>

答案 1 :(得分:0)

根据问题“为什么将Cassandra Java驱动程序嵌入在Spark Cassandra Connector工件中?”在https://github.com/datastax/spark-cassandra-connector/blob/master/doc/FAQ.md中。很难同时使用这两个库。但是我尝试通过在pom中显式指定依赖项来避免该问题。

需要注意以下几点: cassandra-driver- *必须放在spark-cassandra-connector之前。而且3.1.4可能只适用于2.0.0-M1。

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-core</artifactId>
    <version>3.1.4</version>
</dependency>
<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-mapping</artifactId>
    <version>3.1.4</version>
</dependency>
<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-extras</artifactId>
    <version>3.1.4</version>
</dependency>
<dependency>
    <groupId>com.datastax.spark</groupId>
    <artifactId>spark-cassandra-connector_2.11</artifactId>
    <version>2.0.0-M1</version>
</dependency>