首先,SBT有个工作目录(默认位于${user.home}/.sbt)
然后,SBT是利用Apache Ivy来管理依赖的,于是又有一个ivy缓存目录(默认位于${user.home}/.ivy2)这两个目录默认位于C盘,像我这么喜欢重装系统的人,最讨厌把东西放在C盘了,所以要想办法修改这两个目录的定位。
方法很简单,比如我们要将上述目录移动到D:\Tools\sbt,只需在环境变量中添加一个变量SBT_OPTS,值为
-Dsbt.global.base=D:\Tools\sbt\.sbt -Dsbt.ivy.home=D:\Tools\sbt\.ivy2然后重新运行sbt(如果是通过shift+鼠标右键打开的控制台,那还需要重启下系统确保环境变量起作用)
=================设置方法很简单,以下是分析的过程
我用了很长时间,在sbt-launch.jar中的sbt目录下找到了sbt.boot.properties文件,文件中有如下内容:
[boot] directory: ${sbt.boot.directory-${sbt.global.base-${user.home}/.sbt}/boot/}[ivy] ivy-home: ${sbt.ivy.home-${user.home}/.ivy2/} checksums: ${sbt.checksums-sha1,md5} override-build-repos: ${sbt.override.build.repos-false} repository-config: ${sbt.repository.config-${sbt.global.base-${user.home}/.sbt}/repositories}
其中包含了很奇怪的${}语法,不过细细看来也是能够理解的,“-”左边就是访问property语法,“-”右边则指定一个默认值或另一个表达式。
例如这句话${sbt.ivy.home-${user.home}/.ivy2/}相当于// 伪码ivy-home = if exists("sbt.ivy.home") get("sbt.ivy.home") else if exists("user.home") get("user.home") + "/.ivy2/"通过分析这个文件可以发现,只需要想办法修改sbt.global.base和sbt.ivy.home变量即可。一种方式是直接把路径写入这个文件,然后压缩进jar即可。但这种方式显然是不可取的。另一种方式,自然是通过VM Options传入。
接下来就要从sbt.bat入手。bat文件中一大堆脚本,也不太看得懂,不过java启动命令还是很清楚的
"%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%jansi.jar;%SBT_HOME%sbt-launch.jar;%SBT_HOME%classes" SbtJansiLaunch %*
其中%SBT_OPTS%在脚本的其他地方并没有用到,同时变量名也指明了它是用于配置SBT属性的,于是就有了上述方法的尝试,居然还成功了。