【问题标题】:Ant is not able to delete some files on windowsAnt无法删除Windows上的某些文件
【发布时间】:2010-09-09 19:08:51
【问题描述】:

我有一个构建目录、调用 javac 和所有常规内容的 ant 构建。我遇到的问题是,当我尝试清理(删除所有生成的东西)时,删除任务报告无法删除某些文件。当我尝试手动删除它们时,它工作得很好。这些文件显然没有被任何其他进程打开,但 ant 仍然无法删除它们。我能做什么?

【问题讨论】:

  • 你使用的 Ant 版本是什么?
  • 当 ant 试图从之前的任务中移除它们时,它们仍然可以打开

标签: java windows ant build-automation


【解决方案1】:

我曾经遇到过这个问题。 这是因为我试图删除的文件是另一个任务的 classpath 的一部分。

【讨论】:

  • @StefanSpreger 你必须以正确的顺序执行你的任务
  • 并不总是出现这个问题的原因。有时您只需重新启动系统,一切正常。在这种情况下,可能原因是 Windows 错误地认为某个进程正在使用这些文件。
  • @ShimiBandiel,谢谢,似乎合乎逻辑。我试图手动移动文件,Windows 10 告诉我它正在被 Eclipse 使用。我关闭 Eclipse,移动文件,然后继续我的 ant 构建。让我烦恼的是我需要类路径上的那个文件...
【解决方案2】:

这取决于...

  • Ant 进程没有足够的权限来删除文件(通常是因为它们是由不同的用户创建的,可能是系统用户)。尝试使用 Run As 以管理用户身份运行 Ant 脚本。
  • 当进程死亡或被杀死时,Windows 在清理文件锁方面确实很糟糕;因此,Windows 认为文件被一个已死(或被杀死)的进程锁定。在这种情况下,您只能重新启动。
  • 获得更好的工具来检查您的系统状态。我建议下载 SysInternals 工具并使用它们而不是默认的 Windows 等效工具。

【讨论】:

  • 我同意第 3 点。sysinternals handle.exe 作为分析此类问题的命令行工具非常宝贵。
  • 好的,sysinternals 告诉我 javaw.exe 有一个文件或目录的句柄,现在怎么办?
【解决方案3】:

使用 Ant Retry 任务对我有帮助。 我刚刚将它包裹在删除任务中。

【讨论】:

    【解决方案4】:

    您不会说您的构建是否以当前登录的用户身份运行。如果没有,explorer.exe 或其他进程具有显示的目录这一​​事实也可能导致它被锁定。但是在同一个 explorer.exe 进程中删除它会成功。试试http://ccollomb.free.fr/unlocker/的Unlocker,看看哪些进程锁定了文件/目录。

    【讨论】:

      【解决方案5】:

      Ant 进程中是否有某些东西使文件(或目录)处于打开状态?这将导致您可以在运行 ant 后删除它们,但不能在运行期间删除它们。

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题。
        我的机器上没有设置任何类路径或防病毒软件。
        但是,我使用的 ANT 版本是 32 位的,而我安装的 JDK 是 64 位的。
        我安装了一个 32 位的 JDK,问题得到了解决。

        【讨论】:

        • 对我来说同样的问题...在更改为 32 位 jdk 后工作...谢谢兄弟
        【解决方案7】:

        Ant 1.8.0 之前的版本有一个错误,会导致删除操作期间出现随机错误。尝试使用 Ant 1.8.0 或更高版本。

        您可以在此处查看错误详细信息https://issues.apache.org/bugzilla/show_bug.cgi?id=45960

        【讨论】:

          【解决方案8】:

          在我的情况下,我的 ant clean 从 Eclipse 失败,无法删除构建文件。我不时看到这个。通常在重复尝试时会成功。这次没有。 尝试从命令行运行 ant clean,失败无法删除“无法删除”。 一定是Eclipse一直在抓问题文件,当我退出Eclipse的时候,cmd行就可以删除了。

          【讨论】:

            【解决方案9】:

            我最近经常遇到这个问题,而且是随机的。一次有效,下一次无效。我正在使用 NetBeans(以防万一),并且在 build.xml 中添加了许多额外的任务。我在 -post-jar 任务中遇到了这个问题。当我在文件上调用 unjar 然后删除时会发生这种情况。我怀疑 NB 正在尝试扫描 jar,这会导致它被锁定。

            对我有用的是立即在 -post-jar 的开头重命名 jar 并为其添加 .tmp 扩展名。然后我在临时文件上调用 unjar 。完成后,我将重命名回所需的 jar 名称。

            【讨论】:

              【解决方案10】:

              我也遇到了同样的问题,尝试手动删除构建目录。最后,我通过将项目的 .jar 工件重命名为与项目名称本身不同的名称来解决它。例如:我的项目是门户网站,我的 ant 构建脚本用于生成 portal.jar,其中 eclipse ant 无法删除此 portal.jar。当我更改我的 build.xml 以将我的 .jar 生成为 portalnew.jar 时,eclipse 下次能够删除这个 portalnew.jar。希望这会有所帮助。

              【讨论】:

                【解决方案11】:

                您需要在 Windows 中手动删除它。它对我有用。 (一般要删除的文件都是旧版本的jar。例如:如果存在httpcore.4.2.5.ja5r和httpcore.4.3.jar,会尝试删除4.2.5.jar)

                【讨论】:

                  【解决方案12】:

                  我遇到了这个问题,因为 ant 试图删除的文件正被其他一些服务/进程使用。 我停止了服务,然后 ant 构建脚本确实运行了。

                  【讨论】:

                    【解决方案13】:

                    就我而言,我停止从任务管理器运行 Java 进程并重新运行 Ant 构建文件。文件可以删除,构建成功。

                    【讨论】:

                      【解决方案14】:

                      自从我切换到 Microsoft Windows 10 后,我经常看到这样的问题。在删除文件之前重命名文件为我解决了这个问题:

                      <rename src="file.name" dest="file.name.old"/>
                      <delete file="file.name.old" />
                      

                      【讨论】:

                        【解决方案15】:

                        对我来说,我使用的是 mac,所以我在 ant cmd 之前尝试了 sudo,sudo ant clean all,它确实工作得很好。

                        正如我所读,javac 将无权删除 JAR 文件,因此您可以使用 sudo 或查找替代方法。

                        【讨论】:

                          猜你喜欢
                          • 2017-05-05
                          • 2023-04-07
                          • 1970-01-01
                          • 2013-10-04
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-11-08
                          • 2013-06-01
                          相关资源
                          最近更新 更多