Reputation: 50486
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
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
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
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