3

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>
MrD
  • 2,405
  • 3
  • 22
  • 23

1 Answers1

1

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")
)
Brian Smith
  • 3,383
  • 30
  • 41
  • I forgot to mention `sbt run` threw the exception as well, so it was another dependency causing it. Thanks for the `ExclusionRule` and `excludeAll`. sbt-inspectr didn't work as expected but using manually managed dependencies seems to solve the problem. – MrD Aug 21 '12 at 10:00