tomcat 7取消部署由于log4j.properties而失败

tomcat 7取消部署由于log4j.properties而失败,tomcat,web-applications,log4j,undeploy,Tomcat,Web Applications,Log4j,Undeploy,这个错误令人费解。在我的webapps中,根据建议,我在WEB-IF/classes中具有log4j.properties 当我从eclipse部署时,我在webapp上停止,取消部署,然后部署。奇怪的是,10次中有8次在取消部署时出现以下错误- build.xml:526:FAIL-无法删除[C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\punch]。继续存在此文件可能会导致问题。 我的webapp下唯一剩下的文件

这个错误令人费解。在我的webapps中,根据建议,我在WEB-IF/classes中具有log4j.properties

当我从eclipse部署时,我在webapp上停止,取消部署,然后部署。奇怪的是,10次中有8次在取消部署时出现以下错误-
build.xml:526:FAIL-无法删除[C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\punch]。继续存在此文件可能会导致问题。

我的webapp下唯一剩下的文件是WEB-INF/classes/log4j.properties。其他所有内容都被删除

我也无法手动删除该文件或webapp文件夹。我必须停止Tomcat服务,删除文件夹,然后重新启动

有什么解决办法吗

谢谢

下面是我在build.xml中的删除任务

<target name="remove"
 description="Remove application on servlet container">

<stop url="${manager.url}"
     username="${manager.username}"
     password="${manager.password}"
         path="${app.path}"/>

<undeploy url="${manager.url}"
     username="${manager.username}"
     password="${manager.password}"
         path="${app.path}"/>

</target>


这是因为文件已打开以供读取。你至少需要关闭你的应用程序。这可以很容易地使用。

确保在ServletContextListener的contextDestroyed()方法中调用LogManager.shutdown()。这将确保log4j不会打开该文件。

以下是我的解决方法:

我创建了另一个目标,将war复制到Tomcat的webapp目录

<target name="copywar" depends="dist">
    <copy file="${dist.home}/${app.name}.war" todir="${catalina.home}/webapps" />
</target>

我还确保Tomcat可以在server.xml中重新部署它

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">


这个很好用。感谢您的帮助。

Tomcat有一些文件锁定问题。我已经见过很多次了,但是我从来没有找到解决方案。Tomcat没有任何已知的文件锁定问题。很多第三方库确实存在问题,Tomcat在可能的情况下会跨越许多障碍来解决已知的问题。解决方案是通过探查器识别文件上的锁所在,然后找出如何将其释放。这可能需要针对库的错误报告来提供shutdown()类型的方法。令人沮丧的是,它有时有效,但不是大多数。这将是正确的方法,将是技术债务,现在有一个解决办法…我们有时会遇到这个问题。即使使用servlet destroy方法中的.shutdown()也会发生这种情况。