如何强制SBT使用Java 8?

Phi*_*hil 27 scala sbt

如何强制SBT编译为Java 8类文件.我添加了scalacOptions + =" - target:jvm-1.8",但它提供了以下错误消息:

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

我使用的是SBT版本0.15.5.

我知道我使用Java 8进行编译,因为我将其添加到build.sbt,但我仍然想知道为什么scalacOptions失败并且我不知道scalac产生什么输出.

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

小智 37

您的build.sbt文件需要以下内容.

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

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

  • 为什么有必要获得`initialize`设置的值?在父构建初始化的情况下,这是一个好习惯吗?(这里是新的.) (4认同)
  • 我看到了很多,但是在sbt中编译Java源文件不是"javacOptions"吗?`scalacOptions`对于scalac编译器来说很重要. (3认同)
  • 你也可能想要"`scalacOptions:= Seq(" - target:jvm-1.8")`",正如@akauppi指出的那样. (3认同)

Ken*_*ida 19

在2.11.4中添加了对scalac中jvm-1.8的支持.

Scala版本(2.11.2)不支持-target:jvm-1.8选项.

$ 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.
Run Code Online (Sandbox Code Playgroud)


shv*_*abi 2

Sbt 在这方面不做任何事情,scalac它负责创建 JVM 目标工件。您可以scalac通过使用 来指示使用预期版本scalacOptions。Sbt 仅将 给定的选项传递scalacOptions给 scala 编译器(即scalac)。由于较新版本的scalac已弃用-target标志,sbt 会给您这样的错误。

从 Scala 3.2.2 开始,scalacOptions用于相同目的的正确标志是-java-output-version。所以就变成了:

scalacOptions ++= Seq("-java-output-version", "8")
Run Code Online (Sandbox Code Playgroud)