在Java中指定Java版本 - 在Intellij中使用scala混合项目

时间:2017-05-05 00:37:25

标签: java scala intellij-idea

我有一个包含java代码和scala代码的项目。

结构如下:

--src
   -- main
        --java
             myjavacode.java
        --scala
             myscalacode.scala

现在每次运行sbt package时,scala代码都将在Java 7中编译,但Java代码将在Java 8中编译。

我认为我已经将JDK指定为1.7,但我仍然无法将Java代码更改回Java 7版本。

我应该在Intellij或build.sbt文件中做什么?

1 个答案:

答案 0 :(得分:2)

对于 Scala

SBT 非常聪明:您可以通过指定所需的 Scala 编译器和运行时库的版本scalaVersion属性和 SBT 将下载该版本并使用它来编译 Scala 源。

您还可以通过指定-target属性中的scalacOptions选项,指定 Scala 编译器发出的 Java字节码的版本。例如,

scalacOptions += "-target:jvm-1.7"

但是,在编译 Java 源时,会使用您用来运行 SBT 的当前所选 JDK 。因此,如果 Java 8 Java 的默认版本,并且用于运行 SBT ,则表示 Java 用于编译 Java 源代码的版本 - 我不相信您在 SBT 构建文件中可以做的任何事情除外抱怨当前的 Java 版本是错误的。

但是,您可以指定最小的 Java 版本,然后使用 Java 编译器的-source-target选项来限制语法和输出到您需要的版本。

例如,以下版本适用于版本1.7之后的任何版本的 Java ,但仅编译符合1.7语法的文件,并输出1.7字节码:

// We need at least Java 7.
initialize := {
  val _ = initialize.value // Needed to run previous initialization.
  assert(scala.util.Properties.isJavaAtLeast("1.7"), "My project requires Java 7 or later")
}

// Configure Java compiler appropriately.
javacOptions ++= Seq(
  "-source", "1.7",
  "-target", "1.7",
  "-bootclasspath", "C:\\jdk1.7.0\\lib\\rt.jar"
)

请注意,您仍然需要访问 Java 1.7运行时库(其位置由-bootclasspath参数指定)。

如果没有这个诀窍,那么您需要通过更改 SBT '来指定所需的 Java 版本。的配置。从命令行运行 SBT 时,请参阅this question以获取更多详细信息。对于 IntelliJ 中的 SBT 构建,您需要指定要与 SBT 一起使用的Project JDK。