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

在Intellij中的Java-scala混合项目中指定Java版本,java,scala,intellij-idea,Java,Scala,Intellij Idea,我有一个项目,其中包括java代码和scala代码 结构如下所示: --src -- main --java myjavacode.java --scala myscalacode.scala 现在,每当我运行sbt包,scala代码都将在Java7中编译,而Java代码将在Java8中编译 我想我已经将JDK指定为1.7,但是我仍然无法将java代码更改回Java7版本 我应该在Intellij或bui

我有一个项目,其中包括java代码和scala代码

结构如下所示:

--src
   -- main
        --java
             myjavacode.java
        --scala
             myscalacode.scala
现在,每当我运行
sbt包
,scala代码都将在Java7中编译,而Java代码将在Java8中编译

我想我已经将JDK指定为1.7,但是我仍然无法将java代码更改回Java7版本

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

sbt在Scala方面非常聪明:您可以通过
scalaVersion
属性指定需要哪个版本的Scala编译器和运行库,sbt将下载该版本并使用它编译Scala源代码

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

但是,在编译Java源代码时,将使用当前选择的用于运行SBT的JDK。因此,如果Java 8是Java的默认版本,并且用于运行SBT,那么这就是用于编译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的更多详细信息,请参阅。对于IntelliJ中的SBT构建,您需要指定与SBT一起使用的项目JDK。

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

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

但是,在编译Java源代码时,将使用当前选择的用于运行SBT的JDK。因此,如果Java 8是Java的默认版本,并且用于运行SBT,那么这就是用于编译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的更多详细信息,请参阅。对于IntelliJ中的SBT构建,您需要指定与SBT一起使用的项目JDK。

向我们展示您的构建。sbtbuild.SBT没有什么特别之处。我应该在sbt文件中添加“java版本”吗?告诉我们您的build.sbtbuild.sbt没有什么特别的。我应该在sbt文件中添加“java版本”吗?顺便说一句,我应该提到,如果您使用的是Scala 2.12,那么我认为Scala运行库将包含JVM 1.8字节码(这不是您可以更改的)。如果您希望程序在JVM 1.7上运行,您可能希望使用Scala 2.11或更早版本。顺便说一句,如果您使用Scala 2.12,那么我认为Scala运行库将包含JVM 1.8字节码(这不是您可以更改的)。如果您想让程序在JVM1.7上运行,您可能需要使用Scala 2.11或更早版本。