Tomcat自动部署有时只会爆发部分WAR

时间:2018-01-17 17:13:58

标签: tomcat autodeploy

我们的Web应用程序管理过程的一部分是在与我们的Web服务器共享的Dropbox目录上创建一个WAR(在Amazon EC2中运行)。我们在Web服务器上运行.NET脚本,监视WAR文件出现在dropbox文件夹中,然后将它们(而不是复制)移动到Tomcat webapps文件夹中。 .NET代码的相关部分是:

$action = { $path = $Event.SourceEventArgs.FullPath
            $changeType = $Event.SourceEventArgs.ChangeType
            Write-Host "Found new WAR file: $path"
            ### Wait until file is not in use, e.g. copy/move is complete
            while (!(IsFileAccessible $path)) {
              Write-Host "Waiting for WAR file to be unused."
              Start-Sleep -s 10
            }
            ### Move the new WAR file to the server deployment folder.
            ### Tomcat will detect the new file and deploy it automatically.
            Move-Item "$path" "C:\Program Files (x86)\Apache Software Foundation\Tomcat 8.0\webapps" -force
            Write-Host "WAR file moved to deployment directory."
          }  

通常这样可以正常工作,但偶尔Tomcat无法爆炸整个WAR,导致网站瘫痪(例如缺少index.html)。有些文件和文件夹在那里,但不是全部。只需删除部署文件夹并再次让Tomcat部署就可以解决问题(因此这表明所有文件都在移动的WAR中)。

我想我实际上并不知道(1)Tomcat是否未能清除先前部署的所有文件并且根本没有爆炸,或者(2)它没有提取WAR的所有文件。

知道什么可能导致这种行为吗?

1 个答案:

答案 0 :(得分:0)

如果有其他人遇到这种特殊情况,我终于找到了提供线索的密钥日志消息,由于未关闭文件的代码,取消部署失败:

org.apache.catalina.startup.HostConfig.undeploy Undeploying context []
[ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.ExpandWar.deleteDir [C:\Program Files (x86)\Apache Software Foundation\Tomcat 8.0\webapps\ROOT\WEB-INF\classes\com\...\web\templates] could not be completely deleted. The presence of the remaining files may cause problems

攻击Java代码:

InputStream in = Util.class.getClassLoader().getResourceAsStream("/com/.../web/templates/"+templateName)

并且流从未关闭过。将它放在try()中自动关闭解决了问题。