Gradle 为什么格拉德尔会这样说;“复制”;目标目录具有提升访问权限的文件/目录时任务失败?

Gradle 为什么格拉德尔会这样说;“复制”;目标目录具有提升访问权限的文件/目录时任务失败?,gradle,Gradle,当使用Gradle copy任务将人工制品复制到包含其他文件和/或目录的目录时,Gradle任务将失败,这些文件和/或目录具有当前用户权限之外的访问权限。Gradle似乎试图枚举目标目录的内容,当它遇到无法读取的文件/目录时,它失败了。我有一种预感,最新的检查试图散列内容,当它无法读取目标目录中的文件/目录时失败。我的理解正确吗?我怎样才能解决这个问题?是否可以仅对复制任务禁用最新检查 环境 我正在Ubuntu 18.04上使用Gradle4.8.1 背景故事 我在学习gradle课程时遇到了这

当使用Gradle copy任务将人工制品复制到包含其他文件和/或目录的目录时,Gradle任务将失败,这些文件和/或目录具有当前用户权限之外的访问权限。Gradle似乎试图枚举目标目录的内容,当它遇到无法读取的文件/目录时,它失败了。我有一种预感,最新的检查试图散列内容,当它无法读取目标目录中的文件/目录时失败。我的理解正确吗?我怎样才能解决这个问题?是否可以仅对复制任务禁用最新检查

环境 我正在Ubuntu 18.04上使用Gradle4.8.1

背景故事 我在学习gradle课程时遇到了这个挑战/问题。本课程特别介绍了使用复制任务将war文件部署到Tomcat webapps目录。我懒得安装Tomcat堆栈,所以我创建了一个docker映像,其中一个挂载从主机映射到容器中的webapps目录

docker容器以root用户身份运行Tomcat进程,并在第一轮中按预期部署my war。生成的解包目录归
root:root
所有

在重新运行gradle构建脚本以重新部署新的/相同的(无关紧要/不相关的)war文件时,它会失败。这只是让我来到这里的背景。请注意,我不是在寻找更好的方法来设置Tomcat或使用Docker。我的实验/测试从经验上将Tomcat和Docker从方程中分离出来

所有其他与我的错误相关的问题似乎都与MS Windows/防病毒相关。我没有使用Windows,也没有安装防病毒软件

我的gradle.build文件 重要的部分是(正在讨论的任务):

观察 Gradle构建在Eclipse和命令行中都失败。 有三种情况:

场景1:当目标目录不包含具有升级权限的文件/目录时。任务成功

在这种情况下,目标目录可以包含其他文件和目录,只要这些文件和目录不受运行Gradle构建的用户的访问限制,例如,
root:root
不拥有任何文件

场景2:当目标目录包含具有升级权限的文件时。任务失败:

创建一个名为
a
且具有升级权限的文件:

$ touch a
$ sudo chown root:root a
$ sudo chmod 740 a
$ ls -ltra
total 24
drwxr-xr-x 88 donovanh donovanh 20480 Apr  4 00:36 ..
-rwxr-----  1 root     root         0 Apr  4 01:21 a
drwxrwxr-x  2 donovanh donovanh  4096 Apr  4 01:21 .
运行gradle任务:

> Task :deployToWebserver FAILED
:deployToWebserver (Thread[Task worker for ':',5,main]) completed. Took 0.021 secs.

FAILURE: Build failed with an exception.

* What went wrong:
Failed to capture snapshot of output files for task ':deployToWebserver' property 'destinationDir' during up-to-date check.
> Failed to create MD5 hash for file '/home/donovanh/fake/a' as it does not exist.
> Task :deployToWebserver FAILED
:deployToWebserver (Thread[Task worker for ':',5,main]) completed. Took 0.02 secs.

FAILURE: Build failed with an exception.

* What went wrong:
Failed to capture snapshot of output files for task ':deployToWebserver' property 'destinationDir' during up-to-date check.
> Could not read path '/home/donovanh/fake/a'.
与错误相反,文件
a
确实存在,但具有以下权限:

-rwxr-----  1 root     root         0 Apr  4 01:21 a
场景3:当目标目录包含具有升级权限的目录时。任务失败:

使用升级权限创建名为
a
的目录:

$ mkdir a 
$ sudo chmod 740 a
$ sudo chown root:root a
运行gradle任务:

> Task :deployToWebserver FAILED
:deployToWebserver (Thread[Task worker for ':',5,main]) completed. Took 0.021 secs.

FAILURE: Build failed with an exception.

* What went wrong:
Failed to capture snapshot of output files for task ':deployToWebserver' property 'destinationDir' during up-to-date check.
> Failed to create MD5 hash for file '/home/donovanh/fake/a' as it does not exist.
> Task :deployToWebserver FAILED
:deployToWebserver (Thread[Task worker for ':',5,main]) completed. Took 0.02 secs.

FAILURE: Build failed with an exception.

* What went wrong:
Failed to capture snapshot of output files for task ':deployToWebserver' property 'destinationDir' during up-to-date check.
> Could not read path '/home/donovanh/fake/a'.
我注意到目录和文件场景有不同的错误消息,因此它们是两个不同的场景。我假设最新的检查器正在尝试枚举目标目录以创建内容的散列。当遇到无法访问的文件或目录时,它将失败

我还尝试过使用
outputs.uptdatewhen{true}
和outputs.upToDateWhen{false}

根据:

task deployToWebserver(type: Copy, dependsOn: 'war') {
    outputs.upToDateWhen { true/false }
    from war.archivePath
    into "$tomcatWebapps"
}
…毫无用处

问题: 如何将文件复制到包含其他不可访问文件和/或目录的目录