将sbt配置为不使用用户主目录

时间:2015-12-01 21:57:34

标签: scala sbt

上周,我们在CI服务器上更改了用户目录权限,我们不再具有对用户主目录的写入权限。因此sbt无法启动,因为它无法使用以下堆栈跟踪写入~/.ivy等。

java.io.IOException: No such file or directory
  at java.io.UnixFileSystem.createFileExclusively(Native Method)
  at java.io.File.createNewFile(File.java:1006)
  at xsbt.boot.Locks$.apply0(Locks.scala:34)
  at xsbt.boot.Locks$.apply(Locks.scala:28)
  at xsbt.boot.Launch.locked(Launch.scala:238)
  at xsbt.boot.Launch.app(Launch.scala:147)
  at xsbt.boot.Launch.app(Launch.scala:145)
  at xsbt.boot.Launch$.run(Launch.scala:102)
  at xsbt.boot.Launch$$anonfun$apply$1.apply(Launch.scala:35)
  at xsbt.boot.Launch$.launch(Launch.scala:117)
  at xsbt.boot.Launch$.apply(Launch.scala:18)
  at xsbt.boot.Boot$.runImpl(Boot.scala:41)
  at xsbt.boot.Boot$.main(Boot.scala:17)
  at xsbt.boot.Boot.main(Boot.scala)
 Error during sbt execution: java.io.IOException: No such file or directory

我知道我们可以设置一些sbt变量,例如the boot directory。我还没有找到我们可以配置的所有变量的确定列表,否则默认为用户主目录的子目录。我还没有找到设置默认根目录的方法,这可能反过来影响所有这些变量。

有人可以指出如何配置sbt,使其不使用用户的任何文件的主目录吗?

3 个答案:

答案 0 :(得分:4)

如果您希望在不同的位置使用.ivy运行,并且您正在使用sbt extras启动脚本,那么您应该能够:

sbt -ivy /path/to/ivy package

它会将所有常春藤内容下载到指定位置并运行您需要的任何命令(在此示例中为package

答案 1 :(得分:4)

此处其他答案中提到的常春藤路径选项是解决方案的一部分。正如this answer中指出的那样,你需要为sbt本身和项目设置常春藤。此外,正如我在this sbt github issue comment上发现的那样,sbt还需要另一个目录用于自己的东西。

总的来说,我使用了以下三个jvm属性,以便使用项目的相对路径来处理sbt否则使用用户主目录的所有内容:

-Dsbt.global.base=./.sbt/ 
-Dsbt.ivy.home=./.ivy2/ 
-Divy.home=./.ivy2/ 

至少从sbt 0.13.9开始,这就是所需要的。

答案 2 :(得分:3)

使用sbt-extras(首选)时可以设置-ivy,或者可以使用JVM属性:

-Dsbt.ivy.home=/path/to/ivy

我也用过这个:

-Divy.default.ivy.user.dir=/path/to/ivy