【问题标题】:NoClassDefFoundError: io/netty/handler/timeout/IdleStateHandler Datastax dse java driverNoClassDefFoundError:io/netty/handler/timeout/IdleStateHandler Datastax dse java驱动
【发布时间】:2017-05-23 01:54:45
【问题描述】:

我正在尝试使用我的 java 代码连接 ubuntu(启用图形)上的 DSE 5.0 服务器,但出现此错误

Exception in thread "main" java.lang.NoClassDefFoundError: io/netty/handler/timeout/IdleStateHandler
    at com.datastax.driver.core.Connection$Initializer.<init>(Connection.java:1409)
    at com.datastax.driver.core.Connection.initAsync(Connection.java:144)
    at com.datastax.driver.core.Connection$Factory.open(Connection.java:796)
    at com.datastax.driver.core.ControlConnection.tryConnect(ControlConnection.java:253)
    at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:201)
    at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79)
    at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1473)
    at com.datastax.driver.core.Cluster.init(Cluster.java:159)
    at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:330)
    at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:305)
    at com.datastax.driver.core.Cluster.connect(Cluster.java:247)
    at com.datastax.driver.core.DelegatingCluster.connect(DelegatingCluster.java:71)
    at com.datastax.driver.dse.DseCluster.connect(DseCluster.java:351)

正如错误所说,netty 库可能丢失了。

我在 pom.xml 中添加了 netty-all,但也出现了同样的错误。

Pom.xml

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>dse-driver</artifactId>
    <version>1.1.1-beta1</version>
</dependency>
<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>dse-driver</artifactId>
    <version>1.1.1-beta1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.6.Final</version>
</dependency>

感谢您的帮助..!

【问题讨论】:

  • 所讨论的类是否包含在这三个人工制品中?
  • 我认为netty-all 包含所有网络工件

标签: java datastax datastax-enterprise datastax-java-driver datastax-enterprise-graph


【解决方案1】:

Java 驱动程序是针对 Netty 4.0 构建和测试的(请参阅 JAVA-1241 了解 4.1 支持)。可能有一些不兼容的地方阻止了它的工作(尽管我在 Netty 4.1 的那个路径中看到了 IdleStateHandler)。

如果您需要在项目中使用不同版本的 Netty,您可以考虑使用驱动程序的 shaded 分类器,该分类器在其自己的包结构下包含自己的捆绑版本的 netty。由于您使用的是 dse 驱动程序,因此您还需要从其依赖项定义中排除核心驱动程序(这在未来会变得不那么复杂):

    <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-core</artifactId>
        <version>3.1.3</version>
        <classifier>shaded</classifier>
        <!-- Because the shaded JAR uses the original POM, you still need
             to exclude this dependency explicitly: -->
        <exclusions>
            <exclusion>
                <groupId>io.netty</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>dse-driver</artifactId>
        <version>1.1.1-beta1</version>
        <exclusions>
            <exclusion>
                <groupId>com.datastax.cassandra</groupId>
                <artifactId>cassandra-driver-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

【讨论】:

  • dse-driver默认不包含netty驱动,那么.NoClassDefFoundError: io/netty/handler/timeout/IdleStateHandler的可能原因是什么
  • 如果你也可以这样:-> 如果我想使用 dse-graph 功能,我将必须包含哪些库 java-dse-graph + dse-driver + cassandra-driver-core 或仅 java-dse-graph
  • 通过从 dse-driver 中排除核心驱动依赖,它也不应该引入 netty,因为这是 netty 依赖的来源。 w/r/t java-dse-graph,您可以添加该依赖项,然后像我的回答一样直接调用 dse-driver 依赖项。它不漂亮,但它会工作。
猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 2016-11-29
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多