首页 > 解决方案 > java.lang.ClassNotFoundException:org.spark_project.guava.collect.MapMaker

问题描述

我正在尝试将 apache spark 与 spring-boot cassandra 项目集成。但是在运行项目时会出现以下错误:

    Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/spark_project/guava/collect/MapMaker] with root cause
    java.lang.ClassNotFoundException: org.spark_project.guava.collect.MapMaker

我检查了我的 maven 依赖项,并且 mapmaker 文件存在于“org/spark_project/guava/collect/”内的 spark-network-common_2.11.jar 中。这是我正在使用的 pom 文件依赖项:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-cassandra</artifactId>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.datastax.cassandra/cassandra-driver-core -->
    <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-core</artifactId>
        <version>3.5.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-network-common -->
    <!-- <dependency>
       <groupId>org.apache.spark</groupId>
       <artifactId>spark-network-common_2.10</artifactId>
       <version>1.3.0</version>
    </dependency> -->
    <!-- <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-network-common_2.11</artifactId>
        <version>2.2.1</version>
    </dependency> -->


    <!-- https://mvnrepository.com/artifact/com.datastax.cassandra/cassandra-driver-mapping -->
    <!-- <dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-mapping</artifactId> 
        <version>3.5.0</version> </dependency> -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>


    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.2.1</version>
    </dependency>




    <!-- https://mvnrepository.com/artifact/com.datastax.spark/spark-cassandra-connector -->
    <dependency>
        <groupId>com.datastax.spark</groupId>
        <artifactId>spark-cassandra-connector_2.11</artifactId>
        <version>2.0.8</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>2.2.1</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

spark-network-common_2.11.jar 附带了 spark-core 依赖项,我仍然尝试单独添加它,但即使这样也没有用。spring-boot 在运行时无法识别 mapmaker 文件可能是什么问题?任何帮助表示赞赏。

标签: javamavenapache-sparkspring-bootguava

解决方案


“org.spark_project.guava.collect.MapMaker”的包路径严重暗示了guava包已被重新定位到spark_project以避免依赖地狱。

像这样的事情是由构建过程控制的,并且很容易被忽视库之间不兼容的来源。

我的直觉是,您可能正在使用不匹配的库版本,虽然在技术上可能是兼容的,但这并不是因为番石榴的重定位方式不同。

你有

   <artifactId>spark-network-common_2.10</artifactId>

当其他依赖项列出 2.11 时,注释掉。

这些代表使用的 Scala 语言+运行时的版本号,并且应该在使用 Scala 的任何项目中匹配。

哪个类/库正在尝试加载重新定位的 Guava?这应该会给您一个很大的提示,即哪个库可能已过时/不匹配。


推荐阅读