1
votes

I am trying to learn the basics of Scala, scalatest, and sbt and I'm following a tutorial. This is my built.sbt file:

name := "demo-hello"

version := "0.1"

scalaVersion := "2.12.6"

libraryDependencies += "org.scalatest" % "scalatest_2.10" % "2.1.0" % "test"

I have a test that looks like this (showing this is probably unnecessary:

package demo

import org.scalatest.FunSuite

class HelloTest extends FunSuite {
  test("say hello method works correctly") {
    val hello = new Hello
    assert(hello.sayHello("Scala") == "Hello, Scala!")
  }
}

What should I do from here? I am trying to run the test but I get this error:

Error:(8, 36) can't expand macros compiled by previous versions of Scala
    assert(hello.sayHello("Scala") == "Hello, Scala!")

I'm not that familiar with the % symbol btw.

FIX

I changed my build.sbt to this:

name := "demo-hello"

version := "0.1"

scalaVersion := "2.10"

libraryDependencies += "org.scalatest" % "scalatest_2.10" % "2.1.0" % "test"

Remaining questions:

  1. So it seems downgrading to scalaVersion "2.10" worked. Why?
  2. What is an artifact? scalatest is apparently an artifact?
  3. Where is scalaversion 2.10 kept on my machine? It seems I only have scala 2.12. Where in my project folder is version 2.10?
1
"org.scalatest" % "scalatest_2." % "2.1.0" % "test" looks weird. Could you try to change it as "org.scalatest" %% "scalatest" % "2.1.0" % "test"?tkachuko

1 Answers

1
votes

Answering your questions slightly out-of-order:

2 - An "artifact" is something that's built by maven, sbt, or another build system. For Scala or Java, this is almost always a jar file. Each item in libraryDependencies specifies a file in a maven repository (a database of artifacts).

1 - Scala class files are not compatible between minor versions of Scala. When you download a Scala jar from a maven repository, the Scala version is specified as part of the artifact name. The _2.10 in your dependency declares that you wish to use the version of scalatest that's compile for Scala 2.10 - which is why you were getting an error using it in your Scala 2.12 application.

When declaring dependencies on Scala artifacts in sbt, you should always use the %% operator, which automatically appends the appropriate suffix to your artifact, like so:

// This works for any scalaVersion setting.
libraryDependencies += "org.scalatest" %% "scalatest" % "2.1.0" % "test"

3 - sbt handles downloading the appropriate runtime files for the declared version of Scala automatically.