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>
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")
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With