【问题标题】:Specify Java version in Java - scala mixed project in Intellij在 Java 中指定 Java 版本 - Intellij 中的 scala 混合项目
【发布时间】:2017-10-03 08:01:39
【问题描述】:

我有一个项目,其中包含 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 文件中做什么?

【问题讨论】:

  • 向我们展示你的 build.sbt
  • build.sbt 没什么特别的。我是否必须在 sbt 文件中添加“java 版本”?

标签: java scala intellij-idea


【解决方案1】:

SBT 对于 Scala 来说非常聪明:您可以通过scalaVersion 属性,SBT 将下载该版本并使用它来编译您的 Scala 源代码。

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

scalacOptions += "-target:jvm-1.7"

但是,在编译 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 时,请参阅this question 了解更多详细信息。对于 IntelliJ 中的 SBT 构建,您需要指定要与 SBT 一起使用的项目 JDK。

【讨论】:

  • 顺便说一句,我应该提一下,如果您使用的是 Scala 2.12,那么我认为 Scala 运行时库将包含 JVM 1.8 字节码(这不是你可以改变的)。如果您希望您的程序在 JVM 1.7 上运行,您可能需要使用 Scala 2.11 或更早版本。
猜你喜欢
  • 2011-12-08
  • 2014-01-01
  • 2011-05-25
  • 2016-02-23
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2021-10-25
相关资源
最近更新 更多