【问题标题】:Project-specific SBT JVM options项目特定的 SBT JVM 选项
【发布时间】:2020-10-20 10:16:41
【问题描述】:

对于一个项目,我需要使用特定的 JVM 选项(-Dfile.encoding=UTF-8 和一些内存/gc 选项)启动 SBT - 但我不一定想将这些相同的选项应用于我拥有的每个 SBT 项目。

我已经看到(在 sbt-extras 中)对 .sbtopts(项目特定 SBT 命令行选项)和 .jvmopts(项目特定SBT JVM 选项)应该支持此功能的文件,如果在 SBT 项目的根目录中找到,但标准 Windows 版本的SBT(我使用的是 0.13.1 版本)似乎忽略了它们。

sbt-extras 方法对我很有吸引力,因为假设在版本控制中跟踪 .sbtopts.jvmopts,则需要零 SBT 配置希望构建该项目的人。)

是否有当前机制来指定跨平台工作的特定于项目的SBT选项?

更新:由于我最初提出这个问题,.sbtopts.jvmopts 现在是 SBT 的标准 Linux 版本的一部分,并且不再需要 sbt-extras。但是Windows版本只支持.jvmopts,不识别.sbtopts

【问题讨论】:

  • .jvmopts.sbtopts 中放置选项是sbt-extras 提供的附加功能,它由SBT 本身支持。您应该尝试使用 cygwin 运行 sbt-extras。
  • 更正:sbt 支持读取.sbtopts(在当前目录中)。 sbt-extras 添加的只是 .jvmopts。但是.sbtopts 就足够了:例如,您可以添加-J-Xmx1G 所以.sbtopts 而不是将-Xmx1G 添加到.jvmopts。但你是对的,sbt.bat 脚本在 Windows 上无法读取...
  • @JacekLaskowski 我的意思是 sbt 的标准 bash 运行程序(这里:github.com/sbt/sbt-launcher-package/blob/master/src/universal/…)确实读取了 .sbtopts 的内容,但遗憾的是 Windows 运行程序没有。虽然是shell脚本,但肯定是自带SBT(0.13)的。
  • 它会请求一个拉取请求 ;-)
  • 更正@gourlaysama 的更正:.sbtopts.jvmopts 都是supported since 1.3.14 (anno 2016) 并在更新的问题中提到。在写这篇评论之前我没有阅读更新,所以如果你正在阅读这篇文章,你也可能没有阅读过更新! ??????

标签: sbt


【解决方案1】:

这是 Windows 上当前 SBT 版本(在撰写本文时为 v1.0.3)的公认限制(它无法识别 .sbtopts在项目的根目录中)。现在所有版本都支持.jvmopts 文件。

您可以在sbt-launcher-package's _GitHub issue tracker 上跟踪此问题的状态。

更新:此issue 已于 2019 年 10 月修复。感谢@conny 指出这一点。

【讨论】:

    【解决方案2】:

    看来sbt-launcher-package 项目(在sbt projects umbrella 下增加了一些确定性)是遵循的方式。

    【讨论】:

      【解决方案3】:

      您可以从构建配置中更改 JVM 选项。举个例子:

      fork in run := true
      
      javaOptions += "-Xmx1G"
      

      fork 选项很重要,因为当你执行 run 任务时 sbt 需要启动一个新的 JVM,否则选项将不会应用到当前运行的那个。

      此解释假设您使用的是 sbt 风格的构建;如果您使用的是基于 Scala 的构建(这是我实际使用的),您应该将其编写为:

      lazy val yourProject = Project(id = "some-project-id", base = file("./"),
        settings = Project.defaultSettings ++ Seq(
          fork in run := true,
          javaOptions += "-Xmx1G"
          // ...
        ))
      

      【讨论】:

      • OP 询问有关使用特定设置而不是构建本身运行 sbt 启动器的问题。
      • 我不确定情况是否如此,因为他问:是否有当前机制来指定跨平台工作的特定于项目的 SBT 选项?以我介绍的方式,您甚至可以在多项目构建中逐个项目地调整选项。
      • 不,Jacek 是正确的。我最初的问题是如何配置 SBT 本身。出于某种原因(我猜是出于与 Scala 和 SBT 继承的 Java 相关的历史原因),Windows 文本文件的默认编码是 windows-1252,而对于其他操作系统,默认编码是 UTF-8 - 一个明显的交叉问题-平台兼容性。 (例如,Scalastyle SBT 插件可以为不同的编码提供不同的结果。)此外,与 SBT 的默认配置相比,一个项目需要额外的内存资源 - 没有它们,构建通常会因内存错误而失败。
      猜你喜欢
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 2014-02-28
      • 2022-01-24
      • 2014-07-17
      • 2013-12-05
      相关资源
      最近更新 更多