设置 sbt 以使用 Java 7 进行编译?

Posted

技术标签:

【中文标题】设置 sbt 以使用 Java 7 进行编译?【英文标题】:Setting up sbt to use Java 7 for compilation? 【发布时间】:2011-12-03 20:10:37 【问题描述】:

我在运行 compile 任务时遇到编译错误,因为源引用了 java.nio.file 包中仅出现在 Java 7 中的新类。

我在build.sbt中有以下内容:

javaHome := Some(file("/opt/jdk/jdk1.7.0"))

fork := true

在 sbt 中:

> show java-home
[info] Some(/opt/jdk/jdk1.7.0)

它在 Eclipse 中编译并运行良好。如何

【问题讨论】:

【参考方案1】:

目前最可靠的(也许是唯一的)方法是在 JDK7 文件夹中使用 java 启动 SBT。

修改您的sbt 启动器脚本;或使用this one,它允许您将Java Home(以及更多!)指定为命令行选项。

~/code/scratch/20111009 sbt -java-home /Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64/Contents/Home
Starting sbt: invoke with -help for other options
[info] Loading global plugins from /Users/jason/.sbt/plugins
[info] Set current project to default-3e990a (in build file:/Users/jason/code/scratch/20111009/)
> console
[info] Compiling 1 Scala source to /Users/jason/code/scratch/20111009/target/scala-2.9.1/classes...
[info] Starting scala interpreter...
[info] 
Welcome to Scala version 2.9.1.final (OpenJDK 64-Bit Server VM, Java 1.7.0-internal).
Type in expressions to have them evaluated.
Type :help for more information.

scala> java.util.Objects.equals(null, null)
res0: Boolean = true

只需设置javaHome := Some(file("/Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64/Contents/Home")) 更改用于编译和派生进程的Java 版本,但不会更改类路径上Java 标准库的版本,也不会更改用于运行测试的版本,它们始终运行相同的JVM作为 SBT。

【讨论】:

windows10sbt-0.13 我用 cmd /C "set JAVA_HOME=c:\apps\jdk1.7.0_80&& sbt" 做到了。不要在 && 之前添加空格,因为它们会影响 JAVA_HOME 变量。 9年后还是这样吗?有没有类似于 Gradle 最近发布的 toolchain 支持,您可以在其中指定用于在构建脚本本身内编译的 Java 版本?【参考方案2】:

如果您使用 Linux 或 Mac,另一种可能是查看jenv,一个命令行 Java 管理器。

它允许您为每个项目选择要使用的 JDK。

【讨论】:

我猜有人修复了链接【参考方案3】:

我使用 virtualenv,它是 Python 生态系统中的一个工具。简而言之,它是一个 shell 脚本,可让您轻松更改 PATH 变量并在需要时恢复到以前的状态。

    首先安装 virtualenvwrapper(一个围绕 virtualenv 的包装器):

    $ apt-get install virtualenvwrapper

    现在使用 Scala-2.11 为 Java8 创建一个虚拟环境。

    $ mkvirtualenv j8s11

    现在,调整 ~/.virtualenvs/j8s11/bin/postactivate 以便为所有工具定义位置。您可以在下面看到一个适合我的示例:

#!/bin/bash JAVA_VERSION=1.8.0_31 SCALA_VERSION=2.11.5 SBT_VERSION=0.13.7 ANT_VERSION=1.9.4 M2_VERSION=3.2.5 GRADLE_VERSION=1.6 PLAY_VERSION=2.3.7 ACTIVATOR_VERSION=1.2.12 IDEA_VERSION=IC-135.475 PYCHARM_VERSION=community-3.4.1 TOOLS_HOME=/opt/开发者 导出 JAVA_HOME=$TOOLS_HOME/jdk$JAVA_VERSION 导出 SCALA_HOME=$TOOLS_HOME/scala-$SCALA_VERSION 导出 SBT_HOME=$TOOLS_HOME/sbt-$SBT_VERSION 导出 ANT_HOME=$TOOLS_HOME/apache-ant-$ANT_VERSION 导出 M2_HOME=$TOOLS_HOME/apache-maven-$M2_VERSION 导出 GRADLE_HOME=$TOOLS_HOME/gradle-$GRADLE_VERSION 导出 PLAY_HOME=$TOOLS_HOME/play-$PLAY_VERSION 导出 ACTIVATOR_HOME=$TOOLS_HOME/activator-$ACTIVATOR_VERSION 导出 IDEA_HOME=$TOOLS_HOME/idea-$IDEA_VERSION 导出 PYCHARM_HOME=$TOOLS_HOME/pycharm-$PYCHARM_VERSION PATH=$PYCHARM_HOME/bin:$PATH PATH=$IDEA_HOME/bin:$PATH PATH=$ACTIVATOR_HOME:$PATH PATH=$PLAY_HOME:$PATH PATH=$GRADLE_HOME/bin:$PATH PATH=$M2_HOME/bin:$PATH PATH=$ANT_HOME/bin:$PATH PATH=$SBT_HOME/bin:$PATH PATH=$SCALA_HOME/bin:$PATH PATH=$JAVA_HOME/bin:$PATH 导出路径
    现在您可以使用 workon 在环境之间切换。示例:
rgomes@terra:~$ 工作在 j8s11 (j8s11)rgomes@terra:~$ java -version java版本“1.8.0_31” Java(TM) SE 运行时环境 (build 1.8.0_31-b13) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.31-b07,混合模式) (j8s11)rgomes@terra:~$ scala -version Scala 代码运行器版本 2.11.5 -- 版权所有 2002-2013,LAMP/EPFL (j8s11)rgomes@terra:~$ 工作在 j7s10 (j7s10)rgomes@terra:~$ java -version java版本“1.7.0_71” Java(TM) SE 运行时环境 (build 1.7.0_71-b14) Java HotSpot(TM) 64 位服务器 VM(内部版本 24.71-b01,混合模式) (j7s10)rgomes@terra:~$ scala -version Scala 代码运行器版本 2.10.4 -- 版权所有 2002-2013,LAMP/EPFL

【讨论】:

【参考方案4】:

我假设您想更改默认情况下在 JAVA_HOME 中设置的任何内容,您可以在调用 sbt 时执行此操作:

JAVA_HOME=<path-to-jdk-home> sbt

这适用于我在 sbt 0.13.8 的 OSX 上

【讨论】:

【参考方案5】:

将 javacOption 更改为 1.7?我认为没有必要设置 javaHome。

【讨论】:

以上是关于设置 sbt 以使用 Java 7 进行编译?的主要内容,如果未能解决你的问题,请参考以下文章

编译打包工具sbt的镜像设置

sbt编译播放框架应用程序错误

ScalaPB: 通用跨系统protobuf数据,sbt设置

如何为 sbt 设置堆大小?

如何组装 SBT Scala 库以包含在 Java 7 Maven 项目中?

如何从 IntelliJ IDEA 的 bash 设置 SBT 以避免格式化字符被破坏?