maven - Tomcat部署失败

标签 maven tomcat jenkins

我遇到的问题

我对我的应用程序进行了轻微的更改,并将其 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)

现在,据我所知,只有当我将 antiJarLockingantiResourceLocking 设置为 时,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 目录时,我意识到生成的文件不是 目录。它们是没有扩展名的奇怪文件对象,它们看起来像这样:

enter image description here

对我来说,这表明 Tomcat 操作文件的方式出了问题,这就是问题的核心。我希望这些额外的信息可以帮助别人找到答案!

最佳答案

我看到 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:\:-)

关于maven - Tomcat部署失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20610417/

相关文章:

java - Hibernate-4 显示生成的 SQL 代码

java - 使用 Apache Maven 在 IntelliJ 中构建 Java 项目的内存问题,发生在 Java 7 中,使用 Java 8 构建良好

jenkins - 几步后,SoapUI 卡在 Jenkins 上

java - Jenkins:您的 JAVA_HOME 在 OS X 上无效

java - 错误: Could not find or load main class maven project

maven - 无法在启用 LDAP 的情况下使用加密密码部署 Artifact

java - 无法通过 chrome/firefox 获取请求参数值。与双重转义有关?

java - 失败 - 上下文路径/j2eeapplication 中的应用程序无法启动

java - 我想读取tomcat context.xml的参数

jenkins - 如何连接 Jenkinsfile 中的字符串?