文档章节

JFinal 部署在 Tomcat 下推荐方法

JFinal
 JFinal
发布于 2014/12/06 11:35
字数 618
阅读 30115
收藏 160

   经常有人在群里问 tomcat 下项目部署的问题,现写个简单的博文,希望能帮助到有需要的人。

   首先明确一下 JFinal 项目是标准的 java web 项目,其部署方式与普通 java web 项目没有任何差别。Java Web 项目在 Tomcat 下部署有一些不必要的坑需要避免,所以撰写此文方便大家绕过一些坑,以下部署以 linux 为例,windows 与此类似:

1:创建一个目录:   /var/www

2:为将要部署的项目创建一个目录, /var/www/my_project

3:将项目打成 war 包, 然后解压到 /var/www/my_project

4:最终的目录结构为:/var/www/my_project/WEB-INF,也即 WEB-INF 在项目名称目录之下

5:修改  TOMCAT_HOME/conf/ server.xml 文件找到 Host 标记,在其中添加如下子标记: 

    <Context path="" docBase="/var/www/my_project" reloadable="false" />

6:注意 Host 标记中的 appBase 属性不要去修改,让其为默认值 "webapps"

7:启动 tomcat 打完收工

    第一个关键点:以上配置中项目是部署在了 TOMCAT_HOME/webapps 目录之外的,这样做是为了避免 tomcat 加载项目两次的坑,因为配置文件中如果配置了该项目会被加载一次,而项目在 webapps 下面又会被自动重复加载一次,这个坑会引发一些莫名奇妙的问题,例如:老版本的tomcat中,多人同时登录后session产生混乱,再例如:有些项目有定时任务,如果重复加载项目,那么定时任务也会被执行多次。所以记住第一点,永远不要将项目放在 TOMCAT_HOME/webapps 目录下面。

   第二个关键点:以上配置中的 Context 标记的 path 属性一定要设置为 "" 而不是 "/",否则也会跳入一个坑。 docBase 属性后面放项目名称的绝对地址, windows 下则是类似于这样的值: d:/www/my_project。

   简单说 tomcat 下配置分两步,一是在 webapps 目外之外建目录放项目,二是找 Host 标记放入 Context 子标记

  这里还有 tomcat 下 302 重定向问题的坑,可以提前预知一下:http://www.oschina.net/question/941098_93842?fromerr=l2fjHuvx

© 著作权归作者所有

共有 人打赏支持
JFinal

JFinal

粉丝 3996
博文 4
码字总数 2275
作品 4
海淀
CTO(技术副总裁)
私信 提问
加载中

评论(51)

MuskIron
MuskIron
请问,eclipse没有导出war包功能,该怎么样把项目导出来部署?
走位风骚闪着腰
走位风骚闪着腰
tomcat重复加载导致定时任务跑2次
liop
liop

引用来自“tonyfox”的评论

请问一个tomcat下部署多个项目该怎么配置了?0
#此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名##此处输入软件名#
阿卡
阿卡
设计虚拟确实可以解决问题,但如果其他项目一期跑呢 那这个tomcat就不能用了,在某些特定条件下,不能随意改端口呢
12叔
12叔

引用来自“12叔”的评论

我一般 直接改名 为 ROOT.war 放在 webapps 下面 一个tomcat 放一个项目

引用来自“i_am_ajie”的评论

如果只有一个项目没问题,但是不止一个项目就不能这么玩了,tomcat配置页面会找不到
因为管理方式不同 我们不用那个嘛
i
i_am_ajie

引用来自“12叔”的评论

我一般 直接改名 为 ROOT.war 放在 webapps 下面 一个tomcat 放一个项目
如果只有一个项目没问题,但是不止一个项目就不能这么玩了,tomcat配置页面会找不到
windykyo
windykyo

引用来自“windykyo”的评论

如果我直接是用ROOT方式部署,应该不会有类似的问题了吧?
项目路径:TOMCAT_HOME/webapps/ROOT
TOMCAT_HOME/conf/ server.xml 文件下不添加<Context path="" docBase="/var/www/my_project" reloadable="false" />

引用来自“JFinal”的评论

可能仍然有问题,因为放在 webapps/ROOT 的项目默认会被加载一次,而通过 Host 标记配置的 Context 又再次被载一次,可以通过在项目启动时向日志里写一条数据进行验证

引用来自“windykyo”的评论

感谢回复,我的意思是root方式部署,只部署一个工程,然后server的xml里面,去掉context相关配置,只保留host。


简单加个Listenner试了下,这个监听器只往日志里写条数据,启动之后只有一条数据。
不知道这样验证对不对?

引用来自“JFinal”的评论

如果是 jfinal 项目,在 public void afterJFinalStart() 中添加写日志的代码, Listener 没有试过,不能确定。这种重复加载多次项目在很多时候是看不出来的,直到出现一些诡异的错误才能得知,例如:session 乱串,定时任务被调度双倍次数。我前面讲的写日志的方式或许无法验证

引用来自“windykyo”的评论

了解了。再次感谢解答。

引用来自“JFinal”的评论

如果想将项目部署在 webapps/ROOT 之下,建议去除 server.xml 配置中对该项目的配置项,包括其 Host 与 Context 配置,因为 ROOT 下的项目默认就会被加载
验证了下,去除配置后,tomcat启动就没法加载项目了。如下的这段host配置不能去掉。


apache-tomcat-7.0.69-windows-x64.zip 在该版本验证了下。 ROOT下的项目并咩有默认加载。
JFinal
JFinal

引用来自“windykyo”的评论

如果我直接是用ROOT方式部署,应该不会有类似的问题了吧?
项目路径:TOMCAT_HOME/webapps/ROOT
TOMCAT_HOME/conf/ server.xml 文件下不添加<Context path="" docBase="/var/www/my_project" reloadable="false" />

引用来自“JFinal”的评论

可能仍然有问题,因为放在 webapps/ROOT 的项目默认会被加载一次,而通过 Host 标记配置的 Context 又再次被载一次,可以通过在项目启动时向日志里写一条数据进行验证

引用来自“windykyo”的评论

感谢回复,我的意思是root方式部署,只部署一个工程,然后server的xml里面,去掉context相关配置,只保留host。


简单加个Listenner试了下,这个监听器只往日志里写条数据,启动之后只有一条数据。
不知道这样验证对不对?

引用来自“JFinal”的评论

如果是 jfinal 项目,在 public void afterJFinalStart() 中添加写日志的代码, Listener 没有试过,不能确定。这种重复加载多次项目在很多时候是看不出来的,直到出现一些诡异的错误才能得知,例如:session 乱串,定时任务被调度双倍次数。我前面讲的写日志的方式或许无法验证

引用来自“windykyo”的评论

了解了。再次感谢解答。
如果想将项目部署在 webapps/ROOT 之下,建议去除 server.xml 配置中对该项目的配置项,包括其 Host 与 Context 配置,因为 ROOT 下的项目默认就会被加载
windykyo
windykyo

引用来自“windykyo”的评论

如果我直接是用ROOT方式部署,应该不会有类似的问题了吧?
项目路径:TOMCAT_HOME/webapps/ROOT
TOMCAT_HOME/conf/ server.xml 文件下不添加<Context path="" docBase="/var/www/my_project" reloadable="false" />

引用来自“JFinal”的评论

可能仍然有问题,因为放在 webapps/ROOT 的项目默认会被加载一次,而通过 Host 标记配置的 Context 又再次被载一次,可以通过在项目启动时向日志里写一条数据进行验证

引用来自“windykyo”的评论

感谢回复,我的意思是root方式部署,只部署一个工程,然后server的xml里面,去掉context相关配置,只保留host。


简单加个Listenner试了下,这个监听器只往日志里写条数据,启动之后只有一条数据。
不知道这样验证对不对?

引用来自“JFinal”的评论

如果是 jfinal 项目,在 public void afterJFinalStart() 中添加写日志的代码, Listener 没有试过,不能确定。这种重复加载多次项目在很多时候是看不出来的,直到出现一些诡异的错误才能得知,例如:session 乱串,定时任务被调度双倍次数。我前面讲的写日志的方式或许无法验证
了解了。再次感谢解答。
JFinal
JFinal

引用来自“windykyo”的评论

如果我直接是用ROOT方式部署,应该不会有类似的问题了吧?
项目路径:TOMCAT_HOME/webapps/ROOT
TOMCAT_HOME/conf/ server.xml 文件下不添加<Context path="" docBase="/var/www/my_project" reloadable="false" />

引用来自“JFinal”的评论

可能仍然有问题,因为放在 webapps/ROOT 的项目默认会被加载一次,而通过 Host 标记配置的 Context 又再次被载一次,可以通过在项目启动时向日志里写一条数据进行验证

引用来自“windykyo”的评论

感谢回复,我的意思是root方式部署,只部署一个工程,然后server的xml里面,去掉context相关配置,只保留host。


简单加个Listenner试了下,这个监听器只往日志里写条数据,启动之后只有一条数据。
不知道这样验证对不对?
如果是 jfinal 项目,在 public void afterJFinalStart() 中添加写日志的代码, Listener 没有试过,不能确定。这种重复加载多次项目在很多时候是看不出来的,直到出现一些诡异的错误才能得知,例如:session 乱串,定时任务被调度双倍次数。我前面讲的写日志的方式或许无法验证
JFinal Undertow 1.4 发布,小版本迭代

JFinal Undertow 项目在公司内部试用两个月,在俱乐部内测一个月,在 2018-12-12 号才放出 jfinal undertow 1.3 版本,这个版本已经十分完善好用 jfinal underow 1.4 针对自 1.3 发布以来的一...

JFinal
2018/12/25
0
0
JFinal/jfinal-undertow

jfinal-undertow 项目介绍 jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目。独创 HotSwapClassLoader + HotSwapWatcher 以 319 行代码极简实现热加载开发与部署,前无古人,后必有...

JFinal
2018/11/28
0
0
怎样用命令行启动JFinal网站,并将其安装为一个Windows Service?

我以前是将JFinal网站部署到tomcat中运行的,不过最近发现如下方式(手册、jfinal_demo_for_maven中使用的启动方式) 灵活得多啊!可以指定context root,端口号,context path。最后一个参数...

阿斯蓝
2015/02/17
747
1
两个不同的JFinal项目,同一浏览器打开,session会受影响。

@JFinal 波总你好,想跟你请教个问题: 我们分别在两个tomcat(端口不同)下,部署了不同的jfinal应用,tomact1部署项目p1,tomcat2部署项目p2。当我在同一个浏览器里面打开p1和p2时,后打开的...

blus
2017/09/29
355
8
nginx下的apache和tomcat的session问题

apache用的81端口,下面部署的PHP,tomcat用的8080端口,部署的一个JFinal,nginx配置如下 tomcat里面是一个单独的jfinal做的小型系统,里面有个登录,但是用nginx转发后,每次的session都不...

Just_me
2014/03/13
565
3

没有更多内容

加载失败,请刷新页面

加载更多

Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部