什么表明Eclipse应用程序工作区是否被锁定/正在使用?

时间:2016-10-21 12:44:43

标签: eclipse eclipse-plugin

当我第一次启动Eclipse应用程序(使用我的自定义插件)时,会在工作区文件夹.metadata中创建.lock文件。 如果我尝试启动第二个应用程序,我会收到正确的错误消息" Workspace无法锁定"。 .lock文件阻止我使用相同的工作区启动多个应用程序。

如果我在应用程序运行时手动删除.lock文件,然后尝试启动第二个文件就可以了。没关系,因为我手动删除了阻止我的文件。

这是一个奇怪的部分:

当我关闭应用程序时,.lock文件没有被删除,但我仍然可以启动另一个Eclipse应用程序,因此它似乎并不关心.lock文件。

为什么在关闭应用程序后没有删除.lock文件,以及它如何知道工作区未被使用?

如何手动检查工作区是否正在使用? .lock文件显然不是一个安全的指标。

2 个答案:

答案 0 :(得分:1)

我对锁文件机制的理解是这样的:

  • 在Eclipse实例中打开工作区时,Eclipse首先检查是否存在锁定文件。如果存在,则尝试删除它。
    • 成功删除锁定文件表示当前正在运行的Eclipse实例没有使用该工作空间,因此该实例可以继续;它会创建一个新的锁定文件,在该实例运行时将其保持打开状态。
    • 未能删除锁定文件表示某些Eclipse实例当前正在使用该工作区运行;因为其他实例仍然有文件" open"新实例无法删除它。
  • 在正常关闭时,Eclipse会释放该文件,但不会删除它。因此,以后的Eclipse实例可以在启动时自由删除它。
  • 如果Eclipse崩溃或没有正常关闭,锁文件也会被释放(因为保存它的Eclipse进程被终止),再次允许后续实例在启动时删除它。

答案 1 :(得分:1)

Eclipse确实使用了.lock文件,但它也获得了一个实际的“锁定”文件。在文件上。这通常使用Java FileChannel tryLock方法完成,该方法获取文件的操作系统级别锁定:

RandomAccessFile raFile = new RandomAccessFile(lockFile, "rw");     

FileLock fileLock = raFile.getChannel().tryLock(0, 1, false);

如果文件已被另一个Eclipse锁定,tryLock方法将抛出OverlappingFileLockException

当Eclipse关闭时,锁被释放,文件关闭。

没有必要删除锁定文件,因此不会这样做。

有一个环境变量osgi.locking,可用于更改此行为。

完整代码位于org.eclipse.osgi.internal.location.Locker_JavaNio