【问题标题】:Tomcat deployment failureTomcat部署失败
【发布时间】:2014-01-03 19:32:15
【问题描述】:

我遇到的问题

我对我的应用程序进行了轻微更改,并将其签入 subversion 存储库。签入后,我运行了 Jenkins 构建。 Jenkins 当前正在 Windows 服务器上运行。

我收到的错误如下:

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal       
org.codehaus.mojo:tomcat-maven-plugin:1.1:deploy (deploy) on project sd-rest-servlet: 
Cannot invoke Tomcat manager: FAIL - Deployed application at context path /sd but 
context failed to start

我对此错误消息进行了进一步调查,因此我检查了 Jenkins 服务器上的 Tomcat 日志,发现了一个潜在问题:

SEVERE: Error starting static Resources
java.lang.IllegalArgumentException: Document base C:\Program Files\Apache Software Foundation\Tomcat 6.0\temp\28-sd does not exist or is not a readable directory
at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:142)
at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4320)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4489)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1385)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:306)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1389)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1653)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1662)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1642)
at java.lang.Thread.run(Unknown Source)

现在,据我了解,只有当我在 context 文件中将 antiJarLockingantiResourceLocking 设置为 true 时,才会以这种方式使用 temp 文件夹。但是,如您所见,我没有将其包含在 Context 元素中:

<Context unpackWAR="false">

其他行为

无法取消部署

经过仔细检查,我发现 Jenkins 无法取消部署应用程序。在日志中,我看到了这条消息。

[INFO] Undeploying application at http://localhost:8082/sd
[INFO] OK - Undeployed application at context path /sd

但是,构建在尝试部署时失败,并出现以下错误:

Cannot invoke Tomcat manager: FAIL - Application already exists at path /sd

对 Temp 目录的不稳定访问

我还注意到,每当它尝试访问temp 目录中的任何文件时,它都会抛出相同的IllegalArgumentException。这告诉我temp 目录有问题,但是我已经设置了权限,并且在应用程序的早期,Jenkins 实际上将一个文件放在了temp 目录中。

投放没有问题

Jenkins 实际上毫无问题地部署了应用程序。当文件添加到目录时,我已经看到目录发生了变化,包括temp 目录。这告诉我 Jenkins 随机决定它无法读取目录的内容,尽管它被添加了一个文件。貌似有写权限,没有读权限,真的没有多大意义!

解决问题的尝试

确保文件存在

我首先尝试查看 C:\Program Files\Apache Software Foundation\Tomcat 6.0\temp\28-sd 内部以查看该文件是否存在。果然,它存在。

更改的权限

作为预防措施,我已设置权限以允许服务器上的每个用户完全访问。

研究了Temp目录的使用

我试图配置我的上下文文件以避免使用temp 目录,所以我不知道为什么它仍在尝试从中读取。我对这项技术的来龙去脉没有经验,所以我可能还有一些设置需要temp 文件夹。

编辑

扩展的 Tomcat 日志

18-Dec-2013 12:14:19 org.apache.catalina.startup.HostConfig checkResources
INFO: Undeploying context [/sd]
18-Dec-2013 12:16:06 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor sd.xml
18-Dec-2013 12:16:09 org.apache.catalina.core.StandardContext resourcesStart

<!-- Above stacktrace goes here -->

18-Dec-2013 12:16:09 org.apache.catalina.core.StandardContext start
SEVERE: Error in resourceStart()
18-Dec-2013 12:16:09 org.apache.catalina.core.StandardContext start
SEVERE: Error getConfigured
18-Dec-2013 12:16:09 org.apache.catalina.core.StandardContext start
SEVERE: Context [/sd] startup failed due to previous errors
18-Dec-2013 12:16:09 org.apache.catalina.core.StandardContext stop
INFO: Container org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/sd] has  not been started

有关该问题的更多信息

在第一千次阅读日志后,我重新阅读了这一行:

...Tomcat 6.0\temp\28-sd does not exist or is *not a readable directory*

所以当我再次查看temp 目录时,我意识到正在生成的文件不是directories。它们是这些没有扩展名的奇怪文件对象,它们看起来像这样:

对我来说,这表明 Tomcat 处理文件的方式出了问题,这是问题的核心。我希望这些额外的信息可以帮助某人回答!

【问题讨论】:

  • 这是 Jenkins 的问题,还是您通过 Jenkins 部署的应用程序的问题?在 jenkins 1.540 到 1.544 系列中有一些真正糟糕的 windows 错误
  • 我不确定问题是否仅在于 Jenkins,因为它正在成功构建类似的项目。我认为这是围绕我的 Tomcat 实例的问题。
  • 听起来很像这个老bug:issues.apache.org/bugzilla/show_bug.cgi?id=43611
  • tomcat安装路径有空格的时候也看到了类似的问题。尝试将其移动到 C:\dev\tomcat-6.0.x\
  • 霍兹。我认为这可能是问题所在。好地方!请将此作为答案发布。

标签: maven tomcat jenkins


【解决方案1】:

我看到 Hoaz 建议将部署移出 C:\Program Files\,因为它有空格字符。我想知道这是否是权限问题而不是名称中的空格?

你能不能也试试这些(不用从C:\Program Files\卸载Tomcat):

  1. 将临时目录的位置配置在C:\Program Files\之外

    参考:SO问题How is the Tomcat temp directory location defined?

  2. 更改docBase 和/或appBase 的位置

    参考:Apache 文档http://tomcat.apache.org/tomcat-6.0-doc/config/host.html

此外,强制在“C:\Program Files”之外进行安装可以正常工作,除非/直到有人坚持“这是程序文件应该存在的地方,你知道”。 :-)

【讨论】:

  • 恭喜!好答案。原来是由空间问题触发的,随后的问题是权限问题,所以你不能更准确。
  • 万岁!谢谢克里斯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 2021-05-22
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多