修改SBT默认缓存路径

首先,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属性的,于是就有了上述方法的尝试,居然还成功了。

你可能感兴趣的:(sbt)