运行sbt cmd时“没有锁可用”

时间:2013-07-16 12:19:10

标签: java sbt

建立火花项目,我试图使用sbt。发生以下异常:

java.io.IOException: No locks available
    at sun.nio.ch.FileChannelImpl.lock0(Native Method)
    at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:871)
    at java.nio.channels.FileChannel.tryLock(FileChannel.java:962)
    at xsbt.boot.Locks$GlobalLock.withChannel$1(Locks.scala:88)
    at xsbt.boot.Locks$GlobalLock.xsbt$boot$Locks$GlobalLock$$withChannelRetries$1(Locks.scala:81)
    at xsbt.boot.Locks$GlobalLock$$anonfun$withFileLock$1.apply(Locks.scala:102)
    at xsbt.boot.Using$.withResource(Using.scala:11)
    at xsbt.boot.Using$.apply(Using.scala:10)
    at xsbt.boot.Locks$GlobalLock.ignoringDeadlockAvoided(Locks.scala:62)
    at xsbt.boot.Locks$GlobalLock.withLock(Locks.scala:52)
    at xsbt.boot.Locks$.apply0(Locks.scala:31)
    at xsbt.boot.Locks$.apply(Locks.scala:28)
    at xsbt.boot.Update.apply(Update.scala:100)
    at xsbt.boot.Launch.update(Launch.scala:279)
    at xsbt.boot.Launch.xsbt$boot$Launch$$retrieve$1(Launch.scala:149)
    at xsbt.boot.Launch$$anonfun$3.apply(Launch.scala:157)
    at scala.Option.getOrElse(Option.scala:120)
    at xsbt.boot.Launch.xsbt$boot$Launch$$getAppProvider0(Launch.scala:157)
    at xsbt.boot.Launch$$anon$2.call(Launch.scala:142)
    at xsbt.boot.Locks$GlobalLock.withChannel$1(Locks.scala:98)
    at xsbt.boot.Locks$GlobalLock.xsbt$boot$Locks$GlobalLock$$withChannelRetries$1(Locks.scala:81)
    at xsbt.boot.Locks$GlobalLock$$anonfun$withFileLock$1.apply(Locks.scala:102)
    at xsbt.boot.Using$.withResource(Using.scala:11)
    at xsbt.boot.Using$.apply(Using.scala:10)
    at xsbt.boot.Locks$GlobalLock.ignoringDeadlockAvoided(Locks.scala:62)
    at xsbt.boot.Locks$GlobalLock.withLock(Locks.scala:52)
    at xsbt.boot.Locks$.apply0(Locks.scala:31)
    at xsbt.boot.Locks$.apply(Locks.scala:28)
    at xsbt.boot.Launch.locked(Launch.scala:178)
    at xsbt.boot.Launch.app(Launch.scala:93)
    at xsbt.boot.Launch.app(Launch.scala:91)
    at xsbt.boot.Launch$.run(Launch.scala:51)
    at xsbt.boot.Launch$$anonfun$explicit$1.apply(Launch.scala:45)
    at xsbt.boot.Launch$.launch(Launch.scala:65)
    at xsbt.boot.Launch$.apply(Launch.scala:16)
    at xsbt.boot.Boot$.runImpl(Boot.scala:31)
    at xsbt.boot.Boot$.main(Boot.scala:20)
    at xsbt.boot.Boot.main(Boot.scala)
Error during sbt execution: java.io.IOException: No locks available

我试过的sbt版本:0.11.3-2和0.13.0 我也尝试更改sbt启动目录以避免权限问题。

我知道我做错了。

3 个答案:

答案 0 :(得分:3)

如果您的“user.home”指向未安装NFS的NFS目录,SBT将依赖您的jvm属性“user.home”作为工作目录,并且 SEEMS 获取锁定锁定服务,然后你会得到“无锁可用”错误。

我多次遇到过这个错误(另一种情况是maven尝试在$ HOME / .m2 / ...下获取一些锁)。您有两种选择:

  • 安装NFS锁定服务
  • 告诉sbt不要在NFS中使用您的目录,方法是传递属性-Duser.home = / path / in / local / disk。例如。
    • sbt clean compile -Duser.home=/disk1/myhome

答案 1 :(得分:1)

默认情况下,sbt尝试在启动或执行依赖项解析时获取独占锁。这是为了避免缓存损坏,或删除另一个进程正在使用的JAR文件(这可能会导致一些非常奇怪的错误)。

此锁定通常与分布式文件系统不兼容。有时它甚至会在意外实现的本地文件系统上失败。检查您的FS以查看Java是否支持锁定它。

您应该可以通过以下方式禁用此锁定:

sbt -Dsbt.boot.lock=false

另外,如果您有自己的sbt.boot.properties文件,则需要以下内容:

[boot]
lock: false

这将禁用启动器内部的锁定功能,从而禁用所有使用此功能的sbt项目的锁定。 AFAIK这意味着sbt中的所有内容,尽管某些插件可能直接使用JDK锁定API。

答案 2 :(得分:0)

我真的不知道什么是错的,但我怀疑你的问题可能与this one类似。您是否在NFS安装上使用您的项目和/或sbt和/或主目录的副本进行构建?您是否尝试完全从本地磁盘进行构建?