Windows环境下Maven Jetty插件热部署失败问题求助
问题场景
已配置Jetty Maven插件运行第三方工具构建的非标准目录结构WAR包,pom.xml相关配置如下:
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.50.v20221201</version> <configuration> <war>${jway.webapps.dir}/myapp.war</war> <scanIntervalSeconds>2</scanIntervalSeconds> </configuration> </plugin>
执行mvn jetty:run-war可正常启动服务,但配置scanIntervalSeconds实现热部署后,执行mvn install重新构建时出现以下错误:
java.lang.IllegalStateException: Failed to delete temp dir F:\...\myproject\target\tmp at org.eclipse.jetty.webapp.WebInfConfiguration.configureTempDirectory (WebInfConfiguration.java:532) at org.eclipse.jetty.webapp.WebInfConfiguration.resolveTempDirectory (WebInfConfiguration.java:424) at org.eclipse.jetty.webapp.WebInfConfiguration.preConfigure (WebInfConfiguration.java:140) at org.eclipse.jetty.webapp.WebAppContext.preConfigure (WebAppContext.java:488) at org.eclipse.jetty.webapp.WebAppContext.doStart (WebAppContext.java:523) at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart (JettyWebAppContext.java:397) at org.eclipse.jetty.util.component.AbstractLifeCycle.start (AbstractLifeCycle.java:73) at org.eclipse.jetty.maven.plugin.JettyRunWarMojo.restartWebApp (JettyRunWarMojo.java:113) at org.eclipse.jetty.maven.plugin.AbstractJettyMojo$1.filesChanged (AbstractJettyMojo.java:472) at org.eclipse.jetty.util.Scanner.reportBulkChanges (Scanner.java:848) at org.eclipse.jetty.util.Scanner.reportDifferences (Scanner.java:765) at org.eclipse.jetty.util.Scanner.scan (Scanner.java:641) at org.eclipse.jetty.util.Scanner$1.run (Scanner.java:558) at java.util.TimerThread.mainLoop (Timer.java:555) at java.util.TimerThread.run (Timer.java:505)
错误核心是Windows系统锁定了Jetty临时目录的文件,导致热部署时无法删除该目录。
解决办法
1. 指定自定义临时目录
在Jetty插件配置中添加tempDirectory参数,将临时目录转移到非Maven target目录的位置,避免构建过程中的文件冲突与锁定:
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.50.v20221201</version> <configuration> <war>${jway.webapps.dir}/myapp.war</war> <scanIntervalSeconds>2</scanIntervalSeconds> <!-- 自定义独立临时目录 --> <tempDirectory>${project.basedir}/jetty-temp</tempDirectory> </configuration> </plugin>
2. 缩小扫描范围
只监听目标WAR文件而非整个目录,减少不必要的文件监控,降低Windows锁定临时文件的概率:
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.50.v20221201</version> <configuration> <war>${jway.webapps.dir}/myapp.war</war> <scanIntervalSeconds>2</scanIntervalSeconds> <!-- 仅扫描指定WAR文件 --> <scanTargets> <scanTarget>${jway.webapps.dir}/myapp.war</scanTarget> </scanTargets> </configuration> </plugin>
3. 规避Windows文件锁定特性
- 关闭分区索引服务:右键临时目录所在分区→属性→取消勾选「允许此驱动器上的文件内容编制索引」,避免系统索引进程锁定文件。
- 指定系统临时目录:启动Jetty时通过JVM参数指定临时目录为系统默认临时文件夹,脱离Maven构建目录:
mvn jetty:run-war -Djava.io.tmpdir=C:\temp\jetty-tmp
4. 调整热部署扫描间隔
增大scanIntervalSeconds的值,给mvn install足够的时间完成构建并释放文件锁,例如设置为5秒:
<scanIntervalSeconds>5</scanIntervalSeconds>
5. 手动释放文件锁
若以上方法无效,可手动干预释放锁:
- 在任务管理器中找到Jetty对应的
java.exe进程,结束后重新启动mvn jetty:run-war。 - 使用Process Explorer等工具定位锁定临时目录的进程,强制释放文件句柄。
内容的提问来源于stack exchange,提问作者CHW
相关产品推荐
相关产品推荐

