在linux下部署的时候,为了方便,直接从其他项目拷贝的tomcat过来,导致了一些比较奇怪的问题,浪费了不少时间,写个记录便于以后查看。
1.将war包放入linux服务器的tomcat/webapps目录下
使用idea的Maven插件将项目打包成war包之后(在打成war包之前请重新编译一遍),放到linux服务器的tomcat/webapps下,不用解压缩,原因后续解释,同时删掉webapps下其他无关文件,以免启动时相互影响。
2.删掉tomcat/work下的所有文件
如果tomcat是从其他项目拷贝过来的,一定要删掉下面的文件,防止奇怪的问题产生。应用启动之后,work下面会有该应用的所有文件。
3.修改tomcat/conf/server.xml
修改监听端口号,http访问端口号,以及其他访问http访问端口号,Context路径设置
监听端口号修改如下:
http访问端口号修改如下 :
其他http访问端口修改如下:
修改访问路径以及sessionId设置:
appBase="webapps":配置的webapps对应tomcat/webapps目录;
unpackWARs="true":表示之前放在tomcat/webapps下的war包不用解压,startup.sh启动时自动解压
autoDeploy="true":表示tomcat检测到webapps下的web应用更新时,自动发布
path="/web":表示项目访问路径,即http://localhost:7701/web
docBase="web":假设项目war包为web.war包,则这个地方配置的web即为web.war解压缩后的tomcat/webapps/web文件夹
sessionCookieName="web1":手动设置该应用的sessionCookie名称为web1,当同一个linux服务器上两个不同的tomcat部署了相同的应用,即使端口号不一样,即同一个linux部署了http://localhost:7701/web,http://localhost:7702/web两个一样的应用,此时如果不设置sessionCookie的名称,就会导致两个应用的session相互占用,出现异常。因为cookie将同一ip识别为同一域。
4.编写更新脚本update.sh
#此处为Linux下的sh脚本
#!/bin/sh
#将上一版本的war包备份到backup文件夹下,-f表示如果原目录下有该文件,直接覆盖掉该文件
#cp -f /home/model/web/tomcat/webapps/web.war /home/model/web/backup
#替换webapps下的war包
#停止应用 有时进程使用shutdown.sh停不掉,可以使用Linux命令(lsof -i:端口号,此处为lsof -i:7701)先查看该应用占用的进程pid,然后使用(kill -9 pid)杀掉进程,
sh /home/model/web/tomcat/bin/shutdown.sh
#启动应用
sh /home/model/web/tomcat/bin/startup.sh
#查看日志
tail -f /home/model/web/tomcat/logs/catalina.out
5.遇到的问题
1)Linux下sh文件无执行权限
使用Linux命令:chmod +x "*.sh" 为当前用户增加所有sh文件的可执行权限
chmod:修改文件的权限
+:表示增加权限,-表示移除权限
x:如果对象是目录或者它已有执行权限,赋予执行权限
2)slf4j-log4j12-1.7.5.jar与logback-classic-1.1.2.jar冲突
当前web项目使用的日志包为logback-classic-1.1.2.jar,而该项目引用的demo1包中使用了slf4j-log4j12-1.7.5.jar包,两者必须共存,还不能修改任何代码。
首先应该定位冲突的jar包类型,然后确定该web应用使用logback-classic-1.1.2.jar的jar包,想要demo1包依赖的slf4j-log4j12-1.7.5.jar不报错,需要找到是哪个jar包引用了slf4j的包,可以通过IDEA中web项目的Maven Project的依赖树,或者使用快捷键Ctrl+Alt+Shift+U(如果你没改快捷键的话),查看是哪个jar包进行了引用,然后在pom.xml文件中该jar包下添加exclusions,如下:
com.web.demo
demo1
1.0
org.slf4j
slf4j-log4j12
exclusions:表示排除依赖,web包排除对slf4j包的依赖,demo1包中pom文件的内容不变。这样web包的logback-classic-1.1.2.jar与slf4j-log4j12-1.7.5.jar就不会发生冲突了。
dependency:可选依赖。
顺便普及一下Maven依赖的两个原则:路径最短优先,第一声明优先。
3)使用shutdown.sh时,应用的一些线程杀不掉
除了使用lsof -i:7701查找占用进程 ,然后kill -9 pid能杀掉一些进程外,还出现了The web application [web] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@56848cd7]) and a value of type[io.netty.util.internal.InternalThreadLocalMap](value[io.netty.util.internal.InternalThreadLocalMap@64ba5cdf]) but failed to remove it when the web application was stopped.Threads are going to be renewed over time to try and avoid a probable memory leak.
网上查了不少解决方案,看的一知半解,最后删掉tomcat/webapps下除web应用的所有文件,以及work下的所有文件,然后杀掉所有的进程,重新启动就好了。
4)在使用update.sh脚本更新时,有一些进程可能杀不掉,在使用之后,建议检查一下应用是否启动正常
5)大部分问题是因为我直接使用了其他项目的tomcat,收到之前项目的配置或者文件影响,建议在linux部署时直接使用全新的安装包进行部署。
6)tomcat查看日志建议将tomcat/logs/catalina.out与tomcat/logs/localhost*.log(localhost开头的日志)对比查看,了解更详细的报错信息。