如何在Windows上设置sbt以选择特定的JDK(在可用的JDK中)?

如何在Windows上设置sbt以选择特定的JDK(在可用的JDK中)?,windows,scala,sbt,Windows,Scala,Sbt,有没有办法告诉SBT使用哪个(本地)安装的JDK 我很确定我可以更改路径和JAVA_HOME,但我不想更改这些设置,因为它们适用于整个系统(在这种情况下是Windows) 我更喜欢某种类型的命令行参数。如果您希望指定用于运行SBT的JDK(而不是用于从SBT中运行代码和/或测试的JDK),您可以使用JAVA\u HOMES环境变量,以及项目中的.JAVA version文件 这在SBT的SBT.bat文件(通常安装到C:\ProgramFiles(x86)\SBT\bin)中被描述为“穷人的je

有没有办法告诉SBT使用哪个(本地)安装的JDK

我很确定我可以更改
路径
JAVA_HOME
,但我不想更改这些设置,因为它们适用于整个系统(在这种情况下是Windows)


我更喜欢某种类型的命令行参数。

如果您希望指定用于运行SBT的JDK(而不是用于从SBT中运行代码和/或测试的JDK),您可以使用
JAVA\u HOMES
环境变量,以及项目中的
.JAVA version
文件

这在SBT的
SBT.bat
文件(通常安装到
C:\ProgramFiles(x86)\SBT\bin
)中被描述为“穷人的
jenv
”,目前在Windows上不可用

(如果您正在为Linux或MacOS寻找类似的解决方案,您可以使用或通过
-Java home
SBT命令行选项指定Java主目录,遗憾的是,该选项目前还没有在Windows上实现。)

SBT使用
JAVA_HOME
环境变量(不要与
JAVA_HOME
混淆)来标识包含一个或多个JDK安装的目录。例如,如果您使用的是的JDK发行版(在Windows上推荐,如果Oracle的新许可限制对您来说是个问题),那么这通常会被定义为
C:\Program Files\AdoptOpenJDK

假设在
JAVA_HOMES
目录中有两个这样的JDK安装:一个安装在名为
JDK-8.0.212.03-hotspot
的子目录中;另一个在
jdk-11.0.3.7-hotspot
子目录中。通过在每个SBT项目的根目录中创建名为
.java version
的文件,可以逐个项目选择要使用的JDK。要在
JDK-8.0.212.03-hotspot
子目录中使用JDK,该文件应包含:

jdk-8.0.212.03-hotspot
运行
sbt
命令时,如果定义了
JAVA\u HOMES
,sbt将在项目的根目录中查找
.JAVA版本的文件。如果找到它,它将创建一个本地版本的
JAVA\u HOME
,定义为
JAVA\u HOMES
加上
.JAVA version
的最后一行。它还将这个
JAVA\u HOME
bin
目录添加到路径中。(它还创建一个具有相同值的
JDK_HOME
process本地环境变量。)

这应该是你想要的。尽管它不是一个基于命令行的解决方案,但它不会对其他用户产生负面影响,并且允许单独配置每个SBT项目。如果您没有创建系统范围环境变量的权限,您应该仍然能够创建特定于用户的
JAVA\u
环境变量。请注意,在使用此解决方案时,SBT使用的JDK不一定是由系统范围(或特定于用户的)
JAVA\u HOME
环境变量标识的JDK。(如果您尚未定义
JAVA_HOME
,则SBT希望您已定义有效的
JAVA_HOME
变量。)


注意:如果您将
.java版本
提交给源代码管理,则必须确保每个人都定义了一个有效的
java\u HOMES
环境变量,并且在该目录中安装了一个名称完全相同的JDK。

请参阅和。它们可能正是您想要的。@ChaitanyaWaikar您确定这些是唯一可用的选项吗?真的没有现成的命令行属性吗?我不是唯一一个有这种情况的开发人员。@ChaitanyaWaikar补充:对我来说,提到的
sbt extras
看起来只适用于Unix/Linux系统,而不适用于Windows。您可以为当前shell设置env变量,如
JAVA\u HOME
。您不必在系统中全局设置它
设置JAVA_HOME=c:\
,然后从同一个shell运行
sbt
。关闭shell时,env变量将消失,因此每次在新shell中运行sbt时都需要这样做。OK。默认情况下,SBT使用与自身相同的JDK来运行应用程序。我下面的答案对你来说应该没问题……非常有趣的解决方案。没有在官方文件中找到任何参考资料,因此感谢您的详细回答。这似乎没有得到普遍支持;对于windows和sbt.bat来说是独一无二的。@RichardSitze:问题是“如何在windows上设置sbt…”您可以在其他平台上使用jenv;我刚才解释了如何在Windows上指定JDK。@MikeAllen这一点是可以理解的,从标题中可以清楚地看到,并且在您引用sbt.bat时暗示了这一点。这是一个非常有用的回答。也就是说,我通常看不到提供特定于平台的解决方案的工具(尽管对windows来说可能是必要的/有用的),我觉得应该清楚地说明这一点。