logo头像

技术是一种信念

Tomcat常见问题

启动冲突

在tomcat中启动应用的时候出现 ,启动时出现32 位和64 位冲突的错误:

1
java.lang.UnsatisfiedLinkError: D:\tomcat\ydkq-tomcat-client\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform

【原因】原因是因为jdk 的运行环境和tomcat的不一致,一个是32位一个是64位的,改成一致的就可以了

【解决】更换成对应版本的JDK即可。

端口占用

tomcat无法正常启动时,出现Socket bind failed

【原因】 端口被占用

【解决】 在任务管理器中关掉 java.exe , javaw.exe

缓存不够问题

1
[localhost-startStop-1] org.apache.catalina.webresources.Cache.getResource Unable to add the resource at [/WEB-INF/classes/] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache

【解决】

  1. 建议更改Tomcat的setenv.sh 或 setclasspath.sh,加入:

    1
    JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'
  2. 在tomcat的conf 文件夹下面找到context.xml,然后加入下面的代码重启即可。

1
2
3
4
5
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<Resources cachingAllowed="true" cacheMaxSize="100000" />
</Context>

#请求头信息的大小不足

当程序中request的header信息过长时,会出现如下错误:

img

【原因】tomcat访问的请求头的信息的太大,超过tomcat默认配置

【解决办法】:

在tomcat 的conf的server.xml文件中的如下位置加入:maxHttpHeaderSize="65536" maxPostSize="4194304" ,即可。

1
2
3
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" maxHttpHeaderSize="65536" maxPostSize="4194304" URIEncoding="UTF-8"/>
//说明:此选项用于配置:来自于客户端请求的Request和Response的HTTP header的最大长度,以字节计算。如果不设置,该属性为4096(4K)。

web应用编译异常

在以Tomcat作为Web容器,启动java Web工程时,遇到下面问题:

1
2
3
4
5
6
org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
at org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader.<init>(ClassFileReader.java:372)
at org.apache.jasper.compiler.JDTCompiler$1.findType(JDTCompiler.java:210)
at org.apache.jasper.compiler.JDTCompiler$1.findType(JDTCompiler.java:165)
at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.askForType(LookupEnvironment.java:109)
at org.eclipse.jdt.internal.compiler.lookup.UnresolvedReferenceBinding.resolve(Unreso

【原因】

​ 系统默认 jdk版本的影响,更换成tomcat中class 文件编译的jdk版本即可。

【解决】

1、JSP文件,受生产环境影响,不同的生产环境会产出不同的结果;
2、部署在Windows、Linux端的工程里的JSP文件,受bin文件和lib文影响;
3、bin文件,存放各种不同平台开启与关闭Tomcat的脚本文件;一般的Tomcat版本里的bin文件,都包含Windows、Linux平台开启与关闭的脚本文件;部署在Windows、Linux端的Tomcat可用一个同一个版本;
4、存Tomcat与web应用的Jar包,JSP文件依赖于servlet.jar和jsp-api.jar;不同的Tomcat版本,如:(Apache-Tomcat 7.0.23和Apache-Tomcat 7.0.33),都会造成影响;部署在Windows、Linux端的Tomcat可用一个同一个版本;

注:同一大版本号,不同小版本号的JDK和Tomcat均会造成Windows和Linux的差异;最佳方案是JDK和Tomcat最初就保持相同的小版本号;

参考文章