You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:13:59