我对我的应用程序进行了轻微更改,并将其检入到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)
现在,根据我的理解,temp
文件夹只有在我antiJarLocking
或antiResourceLocking
true
context
Context
时才会以这种方式使用文件。但是,正如您所看到的,我没有将其包含在<Context unpackWAR="false">
元素中:
[INFO] Undeploying application at http://localhost:8082/sd
[INFO] OK - Undeployed application at context path /sd
无法取消部署
经过仔细检查后,我发现Jenkins无法取消部署该应用程序。在日志中,我看到了这条消息。
Cannot invoke Tomcat manager: FAIL - Application already exists at path /sd
但是,在尝试部署时,构建失败,并出现以下错误:
IllegalArgumentException
对Temp目录的访问不正常
我还注意到,只要它试图访问temp
目录中的任何文件,它就会抛出相同的temp
。这告诉我temp
目录有问题,但是我已经设置了权限,并且在应用程序的早期,Jenkins实际上将文件放在temp
目录中。
没有出现问题
Jenkins实际上部署应用程序没有问题。我已经看到文件添加到目录时会更改目录,包括C:\Program Files\Apache Software Foundation\Tomcat 6.0\temp\28-sd
目录。这告诉我Jenkins随机决定它无法读取目录的内容,尽管事实上它已经添加了一个文件。它似乎具有写权限,但不具有读权限,这实际上没有多大意义!
确保文件存在
我首先尝试查看temp
内部以查看该文件是否存在。果然,它存在。
修改权限
作为预防措施,我已设置权限以允许服务器上的每个用户进行完全访问。
研究了Temp目录的使用
我试图配置我的上下文文件以避免使用temp
目录,所以我不知道它为什么还在尝试从中读取它。我对这项技术的来龙去脉不熟悉,所以我可能仍然有一些需要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日志
...Tomcat 6.0\temp\28-sd does not exist or is *not a readable directory*
有关此问题的更多信息
在阅读了千分之一的日志后,我重读了这一行:
temp
所以当我再次查看directories
目录时,我意识到生成的文件不是{{1}}。它们是这些奇怪的文件对象,没有扩展名,它们看起来像这样:
对我来说,这表明Tomcat操纵文件的方式出了问题,这是问题的核心。我希望这些额外的信息可以帮助有人得到答案!
答案 0 :(得分:6)
我看到由于空间特征,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:\ Program Files”之外可以正常工作,除非/直到有人坚持“那就是程序文件应该存在的地方,你知道”。 : - )