我正在使用带有 OpenDirectory 的新 Mac OS X Server (OS X 10.11) 和用于远程家庭设置的 samba 共享。 在此设置中使用 Android Studio 导致我遇到了 gradle 的一些问题。 Gradle 尝试锁定缓存目录中的文件,这会引发 java IOException。我可以将问题集中到这个演示代码上:
import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class FileLockTest {
public static void main(String[] args) throws Exception {
RandomAccessFile file = null;
FileLock fileLock = null;
try
{
file = new RandomAccessFile(args[0], "rw");
FileChannel fileChannel = file.getChannel();
fileLock = fileChannel.tryLock();
if (fileLock != null){
System.out.println("File is locked");
}
} finally{
if (fileLock != null){
fileLock.release();
}
}
}
}
使用文件名作为第一个参数编译并运行它会显示问题:本地文件可能被锁定(无论这意味着什么),但 samba 共享上的文件会抛出此异常:
Exception in thread "main" java.io.IOException: Operation not supported
at sun.nio.ch.FileDispatcherImpl.lock0(Native Method)
at sun.nio.ch.FileDispatcherImpl.lock(FileDispatcherImpl.java:90)
at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1114)
at java.nio.channels.FileChannel.tryLock(FileChannel.java:1155)
at FileLockTest.main(FileLockTest.java:15)
现在问我的问题:有什么方法可以启用 mac OS X 服务器的 samba 共享的文件锁定功能吗?我是否错过了 samba 服务器的一些棘手设置?
这确实使得使用 Android Studio (/gradle) 无法通过 OpenDirectory 设置..
这个问题已经有近 9 年历史了,没有答案,自从将我的源文件移动到基于 SAMBA 的 NAS 后,我一直遇到同样的问题。我正在使用 Flutter,它使用 Gradle 进行 Android 构建。由于无法锁定文件,构建全部失败。
花了很长时间在 SAMBA 服务器上尝试不同的设置来启用锁定、严格锁定、机会锁、二级机会锁和内核机会锁,但没有任何帮助。
我找到的解决方案是将
GRADLE_USER_HOME
环境变量设置为本地系统上的目录(例如:/tmp/.gradle
),然后构建就能够完成。