Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IncompatibleClassChangeError when testing guava code with sbt

I have a Java 1.6 + Scala 2.9.2 project using maven and sbt. The project started throwing this exception in the tests when I added the guava Cache classes:

java.lang.IncompatibleClassChangeError: 
class com.google.common.cache.CacheBuilder$3 has interface 
com.google.common.base.Ticker as super class  

Doing sbt clean compile works perfectly but sbt clean test throws this exception.

The version of guava is 13.0

The module raising the exception has:

import com.google.common.cache.{CacheBuilder, Cache}
...
val cache: Cache[String, Integer] = CacheBuilder.newBuilder()  
     .maximumSize(5000).build()

My sbt dependencies are:

libraryDependencies ++= Seq(
    "org.scala-tools.testing" %% "scalacheck" % "1.9" % "test" changing(),
    "org.specs2" %% "specs2" % "1.9" % "test"
)

And the maven dependencies are:

<dependencies>
    <dependency>
      <groupId>org.apache.thrift</groupId>
      <artifactId>libthrift</artifactId>
      <version>0.8.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>13.0</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.6.6</version>
    </dependency>
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.0.0</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>com.googlecode.json-simple</groupId>
      <artifactId>json-simple</artifactId>
      <version>1.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.3.1</version>
    </dependency>
    <dependency>
      <groupId>org.scalatest</groupId>
      <artifactId>scalatest_2.9.1</artifactId>
      <version>1.8</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-all</artifactId>
      <version>1.9.0</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-all</artifactId>
      <version>1.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.novocode</groupId>
      <artifactId>junit-interface</artifactId>
      <version>0.8</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
like image 981
MrD Avatar asked Mar 28 '26 02:03

MrD


1 Answers

Ticker was changed from Interface to abstract class before Guava 13.

The fact that this happens in test but not compile is a good indicator.

I think an earlier version of Guava is ending up on your test classpath, probably as a transitive dependency.

You could try using sbt-inspectr to explore the test classpath and find out more, or you could try excluding, something like:

"org.scala-tools.testing" %% "scalacheck" % "1.9" % "test" changing(), excludeAll(
    ExclusionRule(organization = "com.google.guava")
)
like image 123
Brian Smith Avatar answered Mar 29 '26 14:03

Brian Smith



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!