我遇到的问题
我对我的应用程序进行了轻微的更改,并将其 checkin 了 subversion 存储库。 checkin 后,我运行了 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)
现在,据我所知,只有当我将 antiJarLocking
或 antiResourceLocking
设置为 时,
在 temp
文件夹才会以这种方式使用>truecontext
文件中。但是,如您所见,我没有将此包含在 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 不存在或*不是可读目录*
所以当我再次查看 temp
目录时,我意识到生成的文件不是 目录
。它们是没有扩展名的奇怪文件对象,它们看起来像这样:
对我来说,这表明 Tomcat 操作文件的方式出了问题,这就是问题的核心。我希望这些额外的信息可以帮助别人找到答案!
最佳答案
我看到 Hoaz 建议将部署移出 C:\Program Files\
因为空格字符。我想知道这是否是权限问题而不是名称中的空格?
您能否也试试这些(无需从 C:\Program Files\
卸载 Tomcat):
将临时目录的位置配置在
之外C:\Program Files\
更改
docBase
和/或appBase
的位置引用:Apache 文档 http://tomcat.apache.org/tomcat-6.0-doc/config/host.html
另外,强制安装在“C:\:-)
关于maven - Tomcat部署失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20610417/