Phil
Phil

Reputation: 50486

How to force SBT to use Java 8?

How can I force SBT to compile to Java 8 class files. I added scalacOptions += "-target:jvm-1.8" but it gives the following error message:

[error] 'jvm-1.8' is not a valid choice for '-target'
[error] bad option: '-target:jvm-1.8'
[error] (compile:compile) Compilation failed

I am using SBT version 0.15.5.

I know I am using Java 8 to compile as I added this to build.sbt, but I still wonder why the scalacOptions fails and I don't know what output the scalac produces.

initialize := {
  val _ = initialize.value
  if (sys.props("java.specification.version") != "1.8")
    sys.error("Java 8 is required for this project.")
}

Upvotes: 36

Views: 25512

Answers (3)

shvahabi
shvahabi

Reputation: 1308

Sbt doesn't do anything in this regard, scalac is responsible for creating JVM targeted artifacts. You instruct scalac to use intended version by using scalacOptions. Sbt only passes options given by scalacOptions to the scala compiler (i.e. scalac). Since newer versions of scalac deprecated -target flag, sbt gives you such an error.

As of Scala 3.2.2, the correct scalacOptions flag for the same purpose is -java-output-version. So it becomes:

scalacOptions ++= Seq("-java-output-version", "8")

Upvotes: 2

Renato
Renato

Reputation: 1170

You need the following on your build.sbt file.

javacOptions ++= Seq("-source", "1.8", "-target", "1.8", "-Xlint")

initialize := {
  val _ = initialize.value
  val javaVersion = sys.props("java.specification.version")
  if (javaVersion != "1.8")
    sys.error("Java 1.8 is required for this project. Found " + javaVersion + " instead")
}

Upvotes: 45

Kenji Yoshida
Kenji Yoshida

Reputation: 3118

Support in scalac for jvm-1.8 was added in 2.11.4.

Scala version (2.11.2) does not support -target:jvm-1.8 option.

$ scala -version
Scala code runner version 2.11.2 -- Copyright 2002-2013, LAMP/EPFL

$ scala -target
Usage: -target:<target>
 where <target> choices are jvm-1.5, jvm-1.6, jvm-1.7 (default: jvm-1.6)

bad option: '-target'

Usage: scala <options> [<script|class|object|jar> <arguments>]
   or  scala -help

All options to scalac (see scalac -help) are also allowed.

Upvotes: 19

Related Questions