首页 > 解决方案 > Sbt 汇编 JVM 设置

问题描述

我只是想了解在使用 sbt-assembly 插件在 scala 项目中生成 jar 时设置 JVM 参数的下两种方式之间的区别:

// This works fine - no memory issues while building jar
set "JAVA_OPTS=-Xms2g -Xmx2g"

// in build.sbt 
// Getting memory issues while building jar
javaOptions in assembly += "-Xms2g -Xmx2g"

谢谢,

标签: scalajvmsbtsbt-assembly

解决方案


SBT 是一个 JVM 应用程序,因此,当您使用该sbt命令启动 SBT shell 时,最终会导致启动一个 JVM 实例。

这里的 JAVA_OPTS 是sbt脚本可以理解的环境变量;这些选项被传递给运行 SBT shell 的 JVM 实例,并在其中执行所有任务。实现此目的的另一种方法是传递-mem选项:

sbt -mem 2g

还有一些选项可以将这些参数存储在某些文件中。例如,您可以.sbtopts在项目的根目录中创建一个名为的文件,其内容如下:

-mem 2g

然后每次在这个目录下启动SBT,-mem参数就会自动被拾取。这是一种方便的方法,可以确保所有参与项目的人都使用相同的 SBT 选项(当然,如果您将此文件提交到存储库),

javaOptions设置是一个 SBT 构建设置,它与为运行 SBT 的 JVM 实例设置的选项完全无关。该javaOptions设置用于配置启动新 JVM 实例的任务,例如,您可以配置 SBT 以在通过runMain任务运行 main 方法时启动新的 JVM 实例,然后可以像这样使用此设置:

runMain / javaOptions := "..."  // same as `javaOptions in runMain` but using more modern (and recommended) syntax

但是,该assembly任务不会启动任何新的 JVM 实例来完成它的工作,它完全在 SBT JVM 实例中运行。因此,设置javaOptionsforassembly不会做任何事情,因为此任务甚至不会读取此设置。


推荐阅读