scala - 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"
谢谢,
解决方案
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 实例中运行。因此,设置javaOptions
forassembly
不会做任何事情,因为此任务甚至不会读取此设置。
推荐阅读
- swift - 序列化 JSON 数据时的空对象
- javascript - 如何从字符串中提取时间?
- java - 为什么 YearMonth 是临时的,而 MonthDay 不是临时的?
- reactjs - 在 React-Select V2 中禁用 opt-groups 功能
- batch-file - 如何使用通配符批量移动/复制文件夹?
- azure-devops - Azure DevOps 不通知对评论的更改
- swift - 关于如何使用 NFCTagReaderSession 的示例
- php - 登录 Laravel - 前视图中的附加表单
- php - 使用单个 PHP 结果集填充 2 列 HTML 表
- python - 在 django 中翻译 python 源中的日期