Cassandra + SpringBoot, java.lang.ClassNotFoundException: com.datastax.oss.protocol.internal.SegmentCodec 卡桑德拉和SpringBoot,java.lang.ClassNotFoundException: com.datastax.oss.protocol.internal.SegmentCodec

9

我正在尝试创建一个使用Cassandra数据库的Spring应用程序。但是,当我尝试运行该应用程序时出现以下错误。

Caused by: java.lang.NoClassDefFoundError: com/datastax/oss/protocol/internal/SegmentCodec
    ... 103 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.datastax.oss.protocol.internal.SegmentCodec
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_152-release]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_152-release]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_152-release]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_152-release]
    ... 103 common frames omitted

Spring Boot版本:2.3.4.RELEASE

Cassandra(spring-boot-starter-data-cassandra)版本:3.0.4

application.yml文件:

spring:

  data:
    cassandra:
      keyspaceName: my_keyspace
      contactPoints: localhost
      port: 9042
      schema-action: CREATE_IF_NOT_EXISTS
      local-datacenter: datacenter1

CassandraConfig.java

@Configuration
@EnableCassandraRepositories(basePackages = "com.myproject.repository")
public class CassandraConfig extends AbstractCassandraConfiguration {

    @Value("${spring.data.cassandra.keyspaceName}")
    private String keyspace;

    @Value("${spring.data.cassandra.contactPoints}")
    private String contactPoints;

    @Value("${spring.data.cassandra.port}")
    private int port;

    @Value("${spring.data.cassandra.local-datacenter}")
    private String dataCenter;

    @Override
    public SchemaAction getSchemaAction() {
        return SchemaAction.CREATE_IF_NOT_EXISTS;
    }

    @Override
    protected SessionBuilderConfigurer getSessionBuilderConfigurer() {
        return new SessionBuilderConfigurer() {
            @Override
            public CqlSessionBuilder configure(CqlSessionBuilder cqlSessionBuilder) {

                return cqlSessionBuilder
                        .addContactPoint(new InetSocketAddress(
                                contactPoints,
                                getPort()))
                        ;

            }
        };
    }

    @Override
    protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
        return Arrays.asList(CreateKeyspaceSpecification
                .createKeyspace(getKeyspaceName())
                .ifNotExists(true)
                .withSimpleReplication()
                .with(KeyspaceOption.DURABLE_WRITES));

    }

    @Override
    protected KeyspacePopulator keyspacePopulator() {
        ResourceKeyspacePopulator keyspacePopulate = new ResourceKeyspacePopulator();
        keyspacePopulate.setSeparator(";");
        keyspacePopulate.setScripts(new ClassPathResource("table-schema.cql"));
        return keyspacePopulate;
    }

    @Override
    protected String getKeyspaceName() {
        return keyspace;
    }

    @Override
    protected int getPort(){
        return port;
    }

    @Override
    public String[] getEntityBasePackages() {
        return new String[]{"com.myproject.entity"};
    }

    @Override
    protected String getLocalDataCenter() {
        return dataCenter;
    }

}

table-schema.cql

CREATE TABLE IF NOT EXISTS orders (order_id text, user_name text, created_at timestamp, item_id text, PRIMARY KEY ((order_id), item_id));

以下是pom.xml中的依赖项(driver.version为4.9.0)

<dependency>
            <groupId>com.datastax.oss</groupId>
            <artifactId>java-driver-core</artifactId>
            <version>${driver.version}</version>
        </dependency>
        <dependency>
            <groupId>com.datastax.oss</groupId>
            <artifactId>java-driver-query-builder</artifactId>
            <version>${driver.version}</version>
        </dependency>
        <dependency>
            <groupId>com.datastax.oss</groupId>
            <artifactId>java-driver-mapper-runtime</artifactId>
            <version>${driver.version}</version>
        </dependency>
1个回答

8

尝试添加此依赖项以获取最新的本地协议版本:

    <!-- https://mvnrepository.com/artifact/com.datastax.oss/native-protocol -->
    <dependency>
        <groupId>com.datastax.oss</groupId>
        <artifactId>native-protocol</artifactId>
        <version>1.4.11</version>
    </dependency>

Spring Boot似乎链接到一个较旧的协议版本,导致出现此异常。


非常感谢!我遇到了相同的错误 java.lang.NoClassDefFoundError: com/datastax/oss/protocol/internal/SegmentCodec,这个答案解决了我的问题! - Miguel M. Serrano
谢谢@bswynn,我被困在这里已经一个星期了。你的解决方案帮了我大忙。 - gulgulu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接