在tomcat上部署项目并进行测试,经常会碰到各种问题。在不同的操作系统上部署,对问题的解决也会有一些差异。

1 发现问题

1.1 项目部署

先将项目达成war包,放到tomcat的webapps目录下,然后启动tomcat,在浏览器中键入项目的部署地址,进行访问,查看效果。

在windows系统中,利用cmd,cd到tomcat安装目录,在bin文件夹中使用shutdown.bat和startup.bat进行关闭和启动tomcat的操作。

在Linux系统中,cd到tomcat的安装目录,在bin目录下,使用./shutdown.sh和./startup.sh命令进行关闭和启动tomcat的操作。

1.2 查看报错信息

查看报错信息,可以分为前端和后端,前端是指浏览器端,在浏览器端可以直接使用F12查看console的信息,比如报500的错误码,我们就需要到后台查看tomcat的信息。一般情况下,我们在前端进行操作,后端tomcat也会有相应的信息显示。这里我们重点说一下tomcat信息查看。

在tomcat启动的时候,伴随着tomcat的启动,启动过程的各种信息也会显示出来。

在window系统中,我们利用startup.bat启动tomcat的时候,cmd会自动打开一个窗口,tomcat启动的信息也会逐条显示出来,如果没有什么问题的信息,会定格显示,如果有异常或者错误信息,会有一个Cause by开头,后面很多信息都会有空格,我们主要看cause by后面的信息,就是引起异常或错误的主要原因。

在Linux系统中,我们利用./startup.sh启动tomcat,不会弹出新窗口来显示启动信息,启动信息会自动保存到日志文件中,启动tomcat命令输入之后,我们切换到logs目录,然后键入tail -f catalina.out命令,可以实时查看tomcat的启动信息,如果有异常或错误,显示的信息也和windows中tomcat信息一样,以cause by开头,后面跟着一些信息。

2 解决问题

Tomcat启动的时候,启动信息随着启动过程在不停的动态显示,如果没有什么问题,信息(Info)会正常显示,如果出现问题我们就会看到cause by,对于cause by后面的信息,我们着重查看第一段信息,即为导致异常或错误的直接原因,下面通过几个调试中的实例来谈谈解决问题的过程。

2.1 redis问题

Tomcat启动后,利用浏览器访问,结果报404错误,也就程序有问题,没有正常运行,查看tomcat信息,发现错误提示如下。

Caused by: org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379 at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1092) ~[spring-data-redis-2.1.3.RELEASE.jar:2.1.3.RELEASE] at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1065) ~[spring-data-redis-2.1.3.RELEASE.jar:2.1.3.RELEASE]    at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:865) ~[spring-data-redis-2.1.3.RELEASE.jar:2.1.3.RELEASE]  at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:340) ~[spring-data-redis-2.1.3.RELEASE.jar:2.1.3.RELEASE]  at org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration$EnableRedisKeyspaceNotificationsInitializer.afterPropertiesSet(RedisHttpSessionConfiguration.java:302) ~[spring-session-data-redis-2.1.2.RELEASE.jar:2.1.2.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE]  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1741) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE]  ... 29 common frames omitted

其中cause by后面的“org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis;”信息很重要,是导致错误的最直接原因。根据信息我们知道是redis连接不上,下面就开始查找redis的问题,首先是配置信息,在application.properties 文件中有关于redis的配置信息,redis服务器信息找到对应的redis服务器,查看redis设置。

比如我们是在windows操作系统中安装的redis,查看redis配置,主要注意以下几点,一个是配置文件,对windows系统来说,redis默认的配置文件是redis安装目录下的redis.windows-server.conf文件,文件打开后,重点查看两个地方,一处是访问ip的显示,bind 127.0.0.1,前面加#号进行注释,让这一句不起作用,因为它的意思是绑定本机ip为127.0.0.1,这样的话,只能本机访问,外部是不能访问的。第二处是protected-mode no,保护模式设置为no,默认是yes。再一个是对防火墙的设置,让防火墙对redis开放端口。Redis的默认端口是6379,如果防火墙是开启状态,可以添加端口规则,让外部网络可以访问6379端口。具体的可以自行百度如何开放防火墙的端口。解决这些设置的问题,一般就可以对redis进行访问了。

2.2 mybatis问题

在页面进行登录的时候,输入用户名密码之后,一直不能登录,查看后台控制台打印的信息,如下

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

大概意思是根据用户名密码,在后台查到两个结果,不知道是哪一个结果,所以就报错了,由于是测试阶段,用户很少,直接到数据库中查看,果然出现了两个一样的用户名密码,这是个程序的bug,在注册时候没有验证用户是否已经注册过,又注册了一遍,在数据库中把刚注册删除,可以正常登录。当然,同时,程序也要进行完善。

2.3 文件权限问题

Tomcat启动过程中,出现异常信息。

java.io.IOException: Unable to create the directory [C:\Program Files\Apache……,

不能在某个目录下创建目录,比如tomcat的webapps里面的war包,tomcat启动时,会将war包解压,在webapps中创建war包同名的项目目录,如果权限不够,就无法创建相应的项目目录。这个问题解决办法就是修改目录的操作权限,比如让用户对相应的webapps目录具有全部的操作权限。如下图所示。

先在webapps上面点击右键,选择属性,然后按照上图进行顺序操作,第四步勾选完全控制,最后应用确定。

3 结语

我们在部署项目到tomcat或其他web应用服务器的过程中,碰到到的各类问题,可以按照控制台信息进行分析,然后找到问题所在,再进行相应的处理。也有的时候,控制台可能没有太多信息,这就需要分析整个项目的请求相应流程,比如权限问题,如果代码不够友好,没有返回信息,我们就需要在代码中加入各种请求的响应信息,查看在哪一步没有响应,把问题定位,这样就可以有针对性的进行分析。

解决tomcat部署项目中碰到的几个问题的更多相关文章

  1. 解决tomcat部署多个虚拟机时报IllegalStateException: Web app root system property already set to 的问题

    解决tomcat部署多个虚拟机时报IllegalStateException: Web app root system property already set to 的问题 在web.xml中添加如 ...

  2. tomcat部署项目访问不加项目名方法

    直接主题:tomcat部署项目访问不加项目名方法是打开tomcat的conf目录下server.xml文件 加入 <Context path="" docBase=" ...

  3. Tomcat 部署项目的几种常见方式

    转自:https://www.cnblogs.com/yuht/p/5714624.html https://www.cnblogs.com/ysocean/p/6893446.html Tomcat ...

  4. Tomcat部署项目修改浏览器上猫咪头像

    一.发现问题用tomcat部署项目,在浏览器标签也上发现了tomcat猫咪图.要把这个图修改掉. 二.解决问题apache-tomcat-5.5.28\webapps\ROOT下的ico文件,将需要替 ...

  5. tomcat部署项目,war包问题

    tomcat部署项目后,war包是否能删除 答案是能删除的,前提是先停掉tomcat后才能删除 1)在tomcat中webapps目录下上传war包后,对war包自动解压 2)war包不能在tomca ...

  6. Tomcat部署项目乱码问题总结

    打包好的war包放在tomcat下,有时会出现中文乱码的情况.首先应当确定项目的编码格式,tomcat的编码格式,以及cmd命令行的编码格式. 项目编码 将要输出到控制台或日志的字符串转为UTF-8 ...

  7. Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.Life

    Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.Life ...

  8. tomcat部署项目问题

    tomcat部署项目的时候,报内存溢出,一种解决方案是直接添加内存,网上都有教程,如下: Windows下,在文件/bin/catalina.bat,Linux下,在文件/bin/catalina.s ...

  9. linux服务器下tomcat部署项目内存溢出

    今天将一个项目部署到linux服务器上,结果tomcat在启动运行到一定时间后就报错.根据以往的经验,查了一些资料,终于解决了该问题并顺便解决了生产环境中的get方式中文传递乱码问题. tomcat启 ...

随机推荐

  1. JavaScript要点汇总——The Most Important

    关于JavaScript的基础变量,运算符的详解以及基本的分支循环嵌套已经在 JS基础变量及JS中的运算符 JS中的循环分支嵌套 说过了,今天我们所说的是做网页中最长用到的东西.内容不算少,要有耐心, ...

  2. 使用清华源替代Ubuntu源

    sudo nano /etc/apt/source.list 替换为如下文本 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main ...

  3. Python学习 Part3:数据结构

    Python学习 Part3:数据结构 1. 深入列表: 所有的列表对象方法 list.append(x): 在列表的末尾添加一个元素 list.extend(L): 在列表的末尾添加一个指定列表的所 ...

  4. python 闯关之路三(面向对象与网络编程)

    1,简述socket 通信原理 如上图,socket通信建立在应用层与TCP/IP协议组通信(运输层)的中间软件抽象层,它是一组接口,在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/ ...

  5. QT5:C++实现基于multimedia的音乐播放器(一)

    上一篇里简略的描述了一下播放器的实现,这一篇开始具体描述一下过程. 环境配置:Qt Creator 打开Qt Creator,创建一个new project,项目名称随你喜欢(我的是MusicPlay ...

  6. Spring Boot全局支持CORS(跨源请求)的配置方法

    http://blog.csdn.net/zhangchao19890805/article/details/53893735

  7. Tiny4412 烧写uboot到emmc步骤

    将uboot写入emmc,并通过EMMC驱动,不在只用SD卡启动 烧写uboot的之前用如下命令查看EMMC卡信息及分区信息: mmcinfo 0: 查看mmc卡信息, 0表示SD卡:1表示emmc卡 ...

  8. 【Java入门提高篇】Java集合类详解(一)

    今天来看看Java里的一个大家伙,那就是集合. 集合嘛,就跟它的名字那样,是一群人多势众的家伙,如果你学过高数,没错,就跟里面说的集合是一个概念,就是一堆对象的集合体.集合就是用来存放和管理其他类对象 ...

  9. Spring Security 实战:QQ登录实现

    准备工作 1.在 QQ互联 申请成为开发者,并创建应用,得到APP ID 和 APP Key.2.了解QQ登录时的 网站应用接入流程.(必须看完看懂) 为了方便各位测试,直接把我自己申请的贡献出来:A ...

  10. 一个js小游戏----总结

    花了大概一天左右的功夫实现了一个js小游戏的基本功能,类似于“雷电”那样的小游戏,实现了随即怪物发生器,碰撞检测,运动等等都实现了,下一个功能是子弹轨迹,还有其他一些扩展功能,没有用库,也没有用web ...