Tomcat问题。运行报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat问题。运行报错相关的知识,希望对你有一定的参考价值。

[JOFFICE] 2011-09-06 03:39:54 ERROR [main] ContextLoader.initWebApplicationContext(215) | Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:349)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:423)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:353)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
at com.bdxyit.core.web.listener.StartupListener.contextInitialized(StartupListener.java:23)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4172)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4671)
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:546)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:637)

参考技术A /WEB-INF/applicationContext.xml
没有找到配置文件
到你的WEB-INF/web.xml中检查上下文配置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
确保文件存在本回答被提问者采纳
参考技术B 仔细核对你的applicationContext.xml配置文件,问题就出在这里,导致不能正确的初始化。 参考技术C 看看是在哪个文件上出得错 在哪个文件上出错就在哪个文件上找错 参考技术D WEB-INF/applicationContext.xml 找不到。

docker运行tomcat报错Cannot find /usr/local/tomcat/bin/setclasspath.sh

docker运行tomcat报错

Cannot find /usr/local/tomcat/bin/setclasspath.sh
This file is needed to run this program

经过尝试,使用用dockerfile打包加入命令

RUN unset CATALINA_HOME

尝试后无效

搜索后,同样的问题有一篇文章:https://www.5axxw.com/questions/content/fypkh1

具体排查过程如下

提示是找不到setclasspath.sh,由于这个tomcat反复重启,、

所以用命令拷贝一份bin目录到当前文件夹

docker cp 容器id:/usr/local/tomcat/bin ./


结果发现setclasspath.sh是存在的,那么问题出在哪呢,找找报错相关代码

在catalina.sh脚本中,导致问题的部分如下:


  if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
    . "$CATALINA_HOME"/bin/setclasspath.sh
  else
    echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
    echo "This file is needed to run this program"
  fi

中括号加上-r 命令表示测试这个文件是否是只读,类似的-x 测试这个文件是否可执行

在有问题的系统中,容器里-r命令调用不正常。

尝试启动一个临时的tomcat8验证,

docker run -it --rm --entrypoint=/bin/bash tomcat:8


备注:执行docker run命令带--rm命令选项,等价于在容器退出后,执行docker rm -v。
执行命令

root@f338debf92f6:/usr/local/tomcat# [[ -r /bin/bash ]]
root@f338debf92f6:/usr/local/tomcat# echo $?
1


在正常的系统上执行

root@0083a80a9ec2:/usr/local/tomcat# [[ -r /bin/bash ]]
root@0083a80a9ec2:/usr/local/tomcat# echo $?
0

$?  命令 表示上个命令的退出状态,或函数的返回值。
对退出状态来说 0表示没有错误,其他任何值表明有错误。一般情况下,大部分命令执行成功会返回 0,失败返回 1,也有一些命令返回其他值,表示不同类型的错误。

如何解决?
这与faccessat2系统调用有关,由于 runc 中的 bug,如果您的内核不支持 faccessat2,它将失败。有文章说升级内核到5.8以上可能好使,我试过了不好使,因为出现问题的内核时5.10的。
方法1:更新 runc >= 1.0.0-rc93 

方法2:--privileged开关运行容器

方法1具体实现:

查看原有runc版本

runc -v

下载1.0.0-rc95版本的runc.amd64

下载地址:Releases · opencontainers/runc · GitHub

改名 加执行权限

mv runc.amd64 runc && chmod +x runc

查看并备份原有runc

whereis runc

有的系统在/usr/bin/目录下 有的系统在 /usr/local/bin/目录下,以下命令以/usr/local/bin/为准/usr/bin/的自行更改目录

mv /usr/local/bin/runc /usr/local/bin/runcbak

覆盖原有runc

cp runc /usr/local/bin/runc

查看runc新版本

runc -v

重启docker

systemctl restart docker

方法2具体实现

docker run执行

docker run --privileged=true -p 8080:8080 tomcat:8

docker-compose.yml添加

version: '2'
services:
    tomcat:
     container_name: tomcat
     image: tomcat:8
     ports:
         - '8080:8080'
     environment:
         - TZ=Asia/Shanghai
     privileged: true
     restart: always

以上是关于Tomcat问题。运行报错的主要内容,如果未能解决你的问题,请参考以下文章

linux 下 tomcat 运行报错 Broken pipe

docker运行tomcat报错Cannot find /usr/local/tomcat/bin/setclasspath.sh

docker运行tomcat报错Cannot find /usr/local/tomcat/bin/setclasspath.sh

运行Tomcat报错 解决方法

tomcat运行报错Failed to start component [StandardEngine[Catalina].StandardHost[localhost].

Linux环境Tomcat运行报错java.lang.OutOfMemoryError