Maven...清理项目失败:无法删除..\org.ow2.util.asm-asm-tree-3.1.jar文件。

84

我使用STS(Spring Tool Suite)+ Maven插件。

每次使用maven-clean运行我的应用程序时,我都会看到以下错误:

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building hhsystem ui 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ ui ---
[INFO] Deleting C:\Users\Nikolay_Tkachev\workspace\HHSystem\UI\target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.471s
[INFO] Finished at: Mon Oct 21 12:34:33 MSK 2013
[INFO] Final Memory: 2M/90M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.4.1:clean (default-clean) on project ui: Failed to clean project: Failed to delete C:\Users\Nikolay_Tkachev\workspace\HHSystem\UI\target\org.ow2.util.asm-asm-tree-3.1.jar -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

我必须关闭STS,前往C:\Users\Nikolay_Tkachev\workspace\HHSystem\UI\target并删除org.ow2.util.asm-asm-tree-3.1.jar

重新启动STS后它就可以正常工作,但这很麻烦。

你能帮我解决这个问题吗?

更新
针对Kalathoki L.:

我从这个状态运行maven-clean

STS screen shot

我从命令行和Eclipse插件中看到相同的行为。

如果我在运行STS时观察Unlocker,我会看到:

unlocker screen shot:


你使用的是哪个服务器? - Yubaraj
我使用 Apache Tomcat 7。 - user2740224
2
请确保停止所有正在使用相同服务器的进程。 - lakshmi
1
简短回答:1. 如果您在Eclipse之外打开了任何项目文件,请关闭它并重试。2. 如果这样做不起作用,请重新启动Eclipse。 - lupchiazoem
25个回答

71

在开始清理之前,请先停止您的服务器。

停止服务器

您可以从“服务器”视图中停止服务器。

要停止服务器:

  1. 在“服务器”视图中( 窗口 > 显示视图 > 其他 > 服务器 > 服务器 > 确定),选择要停止的服务器。
  2. 单击工具栏中的停止服务器 this图标。在“服务器”视图中,服务器的状态将更改为已停止。
  3. 如果由于某些原因服务器无法停止,则可以按以下方式终止进程:

    a. 切换到“调试”透视图。

    b. 在“进程”视图中,选择要停止的服务器进程。

    c. 单击工具栏中的终止 This is an image of the Terminate 图标。

注意: 当终止服务器时,服务器进程将结束,服务器将不会执行正常的停止过程,例如调用servlet的destroy()方法。

来源: Eclipse 帮助文档


我该怎么做?我想看更多细节。 - user2740224
@user2740224 看见 停止服务器 - Yubaraj
当我使用maven-clean时,我的Eclipse服务器停止了。 - user2740224
我不想重启我的服务器,因为重新启动需要太长时间。我该怎么办?我的朋友们不需要重启它。 - Rafael Andrade
这在VSCode中怎么实现? - Ashok kumar Ganesan

38

6
这个方法可以运行,但使用过时的类可能会导致意外行为。 - Chris311
3
为了让我上一条评论更加清晰:Maven构建将继续运行,但目标文件夹可能仍然存在! - Chris311
为什么这个在答案里? - lpkej
2
因为有人用这个答案回答了这个问题? - Paul Brittain

31

在任务管理器中结束java.exe进程,然后运行mvn clean install。这对我很有效。


1
有没有不这样做的方法?我的服务器需要一些时间才能启动,我不想等待 =( - Rafael Andrade
这对我有用。但是,我想知道为什么它有效。您如何知道java.exe是唯一一个在jar上拥有“锁定”的程序? - MasterJoe
这对我有用,但是有没有更“正式”的方法来停止服务器?我是通过mvnw命令行启动的...难道没有停止它的方法吗? - Svend Hansen
没有停止我们不能行吗? - Naanii

16
您的问题在于STS内的一个正在运行的进程正在使用位于目标目录中的文件,而您执行 mvn clean 命令。由于其他进程仍在访问这些文件,Maven 将无法删除这些文件,从而导致失败并出现错误。
在运行 Maven 控制台命令之前,请尝试停止 STS 内的所有进程(测试、服务器、应用程序)。注意:如果 STS 正在清理项目并重新编译源代码而不是运行进程,则可能会出现此行为。

1
你能请其他人来修复问题吗,而不是**Kalathoki L.**吗? - gstackoverflow
1
我该如何修复它?请注意:如果STS正在清理项目并重新编译源代码,而不是运行进程,则可能出现此行为。 - user2740224
你真是太棒了,这在我的情况下是正确的,即正在运行的进程。 - user1742919

13

在执行 mvn clean 命令之前,关闭你已经打开的目标文件夹及其文件。


5
这对我起作用了。我在终端中打开了目标文件夹,这使得Maven无法清理目标文件夹。离开该文件夹后,Maven 又能够正常清理了。 - Idva
1
是的,我在Windows资源管理器中打开了该文件夹! - Pavel
2
在Windows资源管理器中打开了文件夹,这很有帮助! - lpkej
1
我在 /target 路径下打开了 cmd。 - Dave Rincon

9

可能有很多进程使用已编译的源代码,可以是服务器、旧的maven指令或IDE。确保终止所有进程,停止服务器,然后再次执行maven。如果问题仍然存在,则应关闭java.exe进程。

祝好!


1
在这个答案的基础上,我想提供我的一些建议:可能是类似于 Google Drive 的文件夹同步过程占用了你的文件。这就是我遇到的问题。只需终止该进程,构建工作就可以恢复正常了。 - Sargon1
这是我的解决方案。我发现有一个意外的java.exe进程在后台运行,这会阻止maven正常执行。 - Michael Fayad

7

尝试禁用“项目 -> 自动构建”。

正如Scorpio所建议的那样,有一个正在运行的进程锁定了某个文件。

我有一个大型的多模块Maven项目,经常在清理时失败,这个方法对我很有效。完成后,我会重新启用“自动构建”。


6

我也有同样的问题,以下是解决方法:

mvn clean install -U

命令修复了错误。


1
-U 是什么意思? - wheeleruniverse
@jDub9 -U 强制在远程仓库上检查更新的版本和快照。 - Amir

5

摘要: 使用一个外部脚本(批处理文件)来 a)停止服务器和 b)在运行maven-clean之前解锁.jar文件。

步骤:

  1. 将maven-antrun-plugin:run目标绑定到mvn clean的pre-clean阶段。点击此处了解如何操作。

  2. 查看如何使用antrun插件在Windows中运行外部批处理文件:sblundy对"Starting external process"的回答。我们将这个文件称为unlock_handles.bat

  3. 在pre_clean.bat中使用Sysinternals handle实用程序下载链接,以a)停止Tomcat服务器和b)解锁.jar文件。handle -chandle -p在此处非常有用。

哇!这有点繁琐,但它可以可靠地自动化该过程,以便您不需要每次手动执行它!


好的,这是一个粗略的概念验证版本的unlock_handles.bat,供您尝试:

REM "Use handle.exe to figure out the process id and handle ids, parse the output, then close the handle (again using handle.exe)"

cd "C:\Users\Nikolay_Tkachev\workspace\HHSystem\UI\target"
"c:/Program Files/Process Explorer/handle.exe" -p java.exe "C:\Users\Nikolay_Tkachev\workspace\HHSystem\UI\target" > handles.txt

@echo "O====== Going to unlock all the below file handles! =======O"
FOR /F "tokens=1-26 delims=: " %a in (handles.txt) DO @echo %h
FOR /F "tokens=1-26 delims=: " %a in (handles.txt) DO handle -p %c -c %f -y

当然,在尝试之前,您需要更改Sysinternals的handle.exe路径。


我该如何获得 pre_clean.bat 文件? - user2740224
如果您对第二项写更多细节,那将会很有帮助。 - user2740224
我会尝试在今天晚些时候为您提供一个初步版本,但基本上,我们必须编写它;它并不存在!(另外,unlock_files.bat是它所做的更好的名称;pre-clean是它的上下文环境)。 - vijucat
1
我更新了答案,并提供了一个名为unlock_handles.bat的可运行文件。如果它对你有用,请告诉我!编辑:在DOS批处理文件中解析字符串真是太麻烦了 :-) - vijucat
我不明白我需要做什么。 - user2740224

5
如果现有答案中的所有步骤都无效,只需关闭Eclipse,然后再次打开Eclipse即可。

1
你的回答是最好的。 - Diego Romero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接