You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ammonite中添加参数运行SBT命令?

解决Ammonite中执行带-mem参数的SBT命令问题

我帮你理清楚这个问题哈~你遇到的错误是因为把sbt启动脚本的参数和SBT内部命令搞混了,Ammonite的%.sbt魔法方法是用来传递SBT内部命令的,但-mem 3000是给sbt启动程序本身的参数,不是SBT的命令,所以才会报错说-mem不是合法命令。

下面给你两种正确的实现方式:

方式一:直接调用系统进程(推荐)

用Scala的sys.process库直接执行完整的sbt命令行,这样能正确区分启动参数和内部命令:

import sys.process._
// 字符串形式,简单直接
"sbt -mem 3000 clean compile docker:publishLocal" !

// 或者更安全的数组形式(避免路径含空格等特殊情况)
Seq("sbt", "-mem", "3000", "clean", "compile", "docker:publishLocal") !

这里的!表示执行命令并返回退出码,如果想获取命令输出可以用!!(返回输出字符串)。

方式二:使用Ammonite的%魔法命令

如果习惯用Ammonite的魔法命令语法,需要把整个sbt命令作为参数传递,而不是用.sbt子方法:

// 字符串形式
%"sbt -mem 3000 clean compile docker:publishLocal"(pwd)

// 或者数组形式
%("sbt", "-mem", "3000", "clean", "compile", "docker:publishLocal")(pwd)

这种方式本质也是调用系统进程,和方式一原理一致,只是用了Ammonite的语法糖简化写法。

为什么原来的写法不行?

你之前写的%.sbt("-mem 3000", 'clean, 'test)(pwd),其中.sbt方法会把所有传入的参数当作SBT的内部命令去执行,而-mem 3000并不是SBT内部的命令——它是启动sbt程序时的参数,所以SBT会把-mem当成无效命令抛出错误。

内容的提问来源于stack exchange,提问作者pme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:25:40