Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error using cassandra-unit 3.5.0.1 in tests - NoClassDefFoundError: Metadata #276

Open
zygm0nt opened this issue Jul 4, 2018 · 1 comment

Comments

@zygm0nt
Copy link

zygm0nt commented Jul 4, 2018

I have a dependency conflict in tests when using cassandra-unit, and it gives me the following error:

[error]    ExceptionInInitializerError:   (Cluster.java:1476)
[error] com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1476)
[error] com.datastax.driver.core.Cluster.init(Cluster.java:160)
[error] com.datastax.driver.core.Cluster.connectAsync(Cluster.java:342)
[error] com.datastax.driver.core.Cluster.connectAsync(Cluster.java:317)
[error] com.datastax.driver.core.Cluster.connect(Cluster.java:259)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.executeCqlScript(CassandraEmbeddedServer.scala:68)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.executeCqlFile(CassandraEmbeddedServer.scala:54)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.cluster$lzycompute(CassandraEmbeddedServer.scala:25)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.cluster(CassandraEmbeddedServer.scala:17)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.executeCqlFile(CassandraEmbeddedServer.scala:45)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.resetTables(CassandraEmbeddedServer.scala:41)
[error] com.xyzcompany.test.CassandraSpecification$class.com$allegrogroup$reco$test$CassandraSpecification$$cleanupAndPrepare(CassandraSpecification.scala:19)
[error] com.xyzcompany.test.CassandraSpecification$$anonfun$map$1$$anonfun$apply$1.apply$mcV$sp(CassandraSpecification.scala:15)
[error] com.xyzcompany.test.CassandraSpecification$$anonfun$map$1$$anonfun$apply$1.apply(CassandraSpecification.scala:15)
[error] com.xyzcompany.test.CassandraSpecification$$anonfun$map$1$$anonfun$apply$1.apply(CassandraSpecification.scala:15)
[error] io.netty.util.collection.IntObjectHashMap.indexOf(IntObjectHashMap.java:294)
[error] io.netty.util.collection.IntObjectHashMap.get(IntObjectHashMap.java:99)
[error] com.datastax.driver.core.Metadata.indexByCaseInsensitiveHash(Metadata.java:343)
[error] com.datastax.driver.core.Metadata.<clinit>(Metadata.java:49)
[error] com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1476)
[error] com.datastax.driver.core.Cluster.init(Cluster.java:160)
[error] com.datastax.driver.core.Cluster.connectAsync(Cluster.java:342)
[error] com.datastax.driver.core.Cluster.connectAsync(Cluster.java:317)
[error] com.datastax.driver.core.Cluster.connect(Cluster.java:259)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.executeCqlScript(CassandraEmbeddedServer.scala:68)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.executeCqlFile(CassandraEmbeddedServer.scala:54)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.cluster$lzycompute(CassandraEmbeddedServer.scala:25)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.cluster(CassandraEmbeddedServer.scala:17)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.executeCqlFile(CassandraEmbeddedServer.scala:45)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.resetTables(CassandraEmbeddedServer.scala:41)
[error] com.xyzcompany.test.CassandraSpecification$class.com$allegrogroup$reco$test$CassandraSpecification$$cleanupAndPrepare(CassandraSpecification.scala:19)
[error] com.xyzcompany.test.CassandraSpecification$$anonfun$map$1$$anonfun$apply$1.apply$mcV$sp(CassandraSpecification.scala:15)
[error] com.xyzcompany.test.CassandraSpecification$$anonfun$map$1$$anonfun$apply$1.apply(CassandraSpecification.scala:15)
[error] com.xyzcompany.test.CassandraSpecification$$anonfun$map$1$$anonfun$apply$1.apply(CassandraSpecification.scala:15)
[error]
[error] Caused by java.lang.ArrayIndexOutOfBoundsException: -17
[error] io.netty.util.collection.IntObjectHashMap.indexOf(IntObjectHashMap.java:294)
[error] io.netty.util.collection.IntObjectHashMap.get(IntObjectHashMap.java:99)
[error] com.datastax.driver.core.Metadata.indexByCaseInsensitiveHash(Metadata.java:343)
[error] com.datastax.driver.core.Metadata.<clinit>(Metadata.java:49)
[error] com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1476)
[error] com.datastax.driver.core.Cluster.init(Cluster.java:160)
[error] com.datastax.driver.core.Cluster.connectAsync(Cluster.java:342)
[error] com.datastax.driver.core.Cluster.connectAsync(Cluster.java:317)
[error] com.datastax.driver.core.Cluster.connect(Cluster.java:259)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.executeCqlScript(CassandraEmbeddedServer.scala:68)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.executeCqlFile(CassandraEmbeddedServer.scala:54)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.cluster$lzycompute(CassandraEmbeddedServer.scala:25)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.cluster(CassandraEmbeddedServer.scala:17)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.executeCqlFile(CassandraEmbeddedServer.scala:45)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.resetTables(CassandraEmbeddedServer.scala:41)
[error] com.xyzcompany.test.CassandraSpecification$class.com$allegrogroup$reco$test$CassandraSpecification$$cleanupAndPrepare(CassandraSpecification.scala:19)
[error] com.xyzcompany.test.CassandraSpecification$$anonfun$map$1$$anonfun$apply$1.apply$mcV$sp(CassandraSpecification.scala:15)
[error] com.xyzcompany.test.CassandraSpecification$$anonfun$map$1$$anonfun$apply$1.apply(CassandraSpecification.scala:15)
[error] com.xyzcompany.test.CassandraSpecification$$anonfun$map$1$$anonfun$apply$1.apply(CassandraSpecification.scala:15)
[info] ! find by id
[error]    NoClassDefFoundError: : Could not initialize class com.datastax.driver.core.Metadata  (Cluster.java:1476)
[error] com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1476)
[error] com.datastax.driver.core.Cluster.init(Cluster.java:160)
[error] com.datastax.driver.core.Cluster.connectAsync(Cluster.java:342)
[error] com.datastax.driver.core.Cluster.connectAsync(Cluster.java:317)
[error] com.datastax.driver.core.Cluster.connect(Cluster.java:259)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.executeCqlScript(CassandraEmbeddedServer.scala:68)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.executeCqlFile(CassandraEmbeddedServer.scala:54)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.cluster$lzycompute(CassandraEmbeddedServer.scala:25)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.cluster(CassandraEmbeddedServer.scala:17)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.session$lzycompute(CassandraEmbeddedServer.scala:31)
[error] com.xyzcompany.test.CassandraEmbeddedServer$.session(CassandraEmbeddedServer.scala:31)
[error] com.xyzcompany.test.CassandraSpecification$TestCassandraDAOSupport$class.session(CassandraSpecification.scala:33)
[error] com.xyzcompany.persistence.dao.cassandra.CategoryCassandraDAOComponentSpec$$anonfun$1$$anonfun$apply$1$$anon$1.session$lzycompute(CategoryCassandraDAOComponentSpec.scala:10)
[error] com.xyzcompany.persistence.dao.cassandra.CategoryCassandraDAOComponentSpec$$anonfun$1$$anonfun$apply$1$$anon$1.session(CategoryCassandraDAOComponentSpec.scala:10)
[error] com.xyzcompany.persistence.dao.cassandra.CategoryCassandraDAOComponent$CategoryCassandraDAO.<init>(CategoryCassandraDAOComponent.scala:22)
[error] com.xyzcompany.persistence.dao.cassandra.CategoryCassandraDAOComponentSpec$Context$class.$init$(CategoryCassandraDAOComponentSpec.scala:39)
[error] com.xyzcompany.persistence.dao.cassandra.CategoryCassandraDAOComponentSpec$$anonfun$1$$anonfun$apply$1$$anon$1.<init>(CategoryCassandraDAOComponentSpec.scala:10)
[error] com.xyzcompany.persistence.dao.cassandra.CategoryCassandraDAOComponentSpec$$anonfun$1$$anonfun$apply$1.apply(CategoryCassandraDAOComponentSpec.scala:10)
[error] com.xyzcompany.persistence.dao.cassandra.CategoryCassandraDAOComponentSpec$$anonfun$1$$anonfun$apply$1.apply(CategoryCassandraDAOComponentSpec.scala:10)
[info]

It's strange, because the whole code works properly outside tests, so I suppose it's just a conflicting test dependency, but I can't figure out which one to look at.

My versions of cassandra dependencies are as follows:

"com.datastax.cassandra" % "cassandra-driver-core" % "3.5.0"
"org.cassandraunit" % "cassandra-unit" % "3.5.0.1" % "test"

The stacktrace above includes calls from initializing class - CassandraEmbeddedServer. Here is it's source:

import java.io.InputStream

import com.datastax.driver.core.{Cluster, SocketOptions}
import org.cassandraunit.utils.EmbeddedCassandraServerHelper
import org.slf4j.LoggerFactory

object CassandraEmbeddedServer {
  def logger = LoggerFactory.getLogger(this.getClass)

  val TestKeyspace = "reco_dev"
  // settings from cassandra-test.yaml
  private val Host = "127.0.0.1"
  private val CqlPort = 9142

  lazy val cluster = {
    startCassandra()

    val cluster = new Cluster.Builder()
      .addContactPoint(Host)
      .withPort(CqlPort)
      .withSocketOptions(new SocketOptions().setKeepAlive(true)).build()

    executeCqlFile(cluster, "/create_dev_keyspace.cql", keyspace = None)
    executeCqlFile(cluster, "/create_tables.cql")

    cluster
  }

  lazy val session = cluster.connect(TestKeyspace)

  private def startCassandra(): Unit = {
    System.setProperty("cassandra.skip_wait_for_gossip_to_settle", "0")
    System.setProperty("cassandra.start_rpc", "false")
    logger.info(s"Starting embedded Cassandra (host: $Host cqlPort: $CqlPort)...")
    EmbeddedCassandraServerHelper.startEmbeddedCassandra()
  }

  def resetTables(): Unit = {
    executeCqlFile("/cleanup_db.cql")
  }

  def executeCqlFile(cqlFile: String): Unit = {
    executeCqlFile(cluster, cqlFile)
  }

  private def executeCqlFile(cluster: Cluster, cqlFile: String, keyspace: Option[String] = Some(TestKeyspace)): Unit = {
    logger.debug(s"Executing: $cqlFile")
    val resource: InputStream = getClass.getResourceAsStream(cqlFile)
    Option(resource) match {
      case Some(inputStream) =>
        val cql = scala.io.Source.fromInputStream(resource, "UTF-8").mkString
        executeCqlScript(cluster, cql, keyspace)
      case None =>
        throw new IllegalArgumentException(s"cannot find file to execute at $cqlFile")
    }
  }

  def executeCqlScript(cql: String): Unit = {
    executeCqlScript(cluster, cql)
  }

  private def executeCqlScript(cluster: Cluster, cql: String, keyspace: Option[String] = Some(TestKeyspace)): Unit = {
    logger.debug("Executing CQL script")
    val session = keyspace match {
      case Some(k) => cluster.connect(k)
      case None => cluster.connect()
    }

    cql.split(';').filter(!_.trim.isEmpty).foreach(session.execute)

  }
}
@kagrze
Copy link

kagrze commented Aug 22, 2018

Most likely, the reason is an incorrect version of netty in your project.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants