tomcat部署问题

https://www.zhihu.com/question/54757013

作者:木女孩
链接:https://www.zhihu.com/question/54757013/answer/140992590
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先说明啊,下面说的东东有一些呢有多种方法,我不是写说明书(说的好像会写一样),嗯,你懂的,不懂也算了,这个不重要。。。

我的Tomcat装在这个鸟地方的:F: esourceapache-tomcat-8.0.37
我们先搞一个web应用吧,一个pikaqiu,里面有一个aaa.jsp,啊,就是下面这样


可以看到这个pikaqiu在桌面,也就是C:UsersxinxiDesktop



  • 先来说一下虚拟目录

我们怎么才能访问这个aaa.jsp呢,直接把这个pikaqiu复制到tomcat安装目录下的webapps下就行了吧

然后把这个tomcat跑起来,访问,后面我就不说了,浏览器地址栏里有
现在,我不想把这个pikaqiu复制到webapps目录下,让它留在桌面,这要怎么搞呢?
先把webapps下的删了啊,还有tomcat安装目录下的work目录也删了。去Tomcat安装目录conf[enginename][hostname]目录(我这里enginename是Catalina,hostname是localhost)下建立一个xml文件,注意文件名为映射的虚拟路径,就是你浏览器地址栏里面要写的
再把tomcat跑起来
再说一遍啊这玩意儿少说也有4~5种方法,嗯,一定是这样的。
我突然发现好像还得再说一种方法才行,我特么都写到下面eclipse了才发现,真是哔了狗了

这种方法就是修改Tomcat安装目录confserver.xml,在元素中增加一个子元素<Context path="/abc" docBase="C:/Users/xinxi/Desktop/pikaqiu"/>,然后再访问就行了,浏览器访问效果和上面一样。



  • 现在来搞默认的目录

上面的访问都是http://localhost/[虚拟目录]/aaa.jsp,现在要直接http://localhost/aaa.jsp
webapps下有一个ROOT文件夹,他是干嘛的?他也是一个web应用啊,我们装好tomcat之后

这个东西就是那个ROOT了。
现在把pikaqiu复制到webapps下,然后重命名为ROOT,当然你要把它原来的ROOT删了,或者改成其他名字。再把tomcat跑起来
还和上面一样,我还想把pikaqiu留在桌面怎么办呢(还是和上面一样先把webapps下的与皮卡丘有关的都删了啊,再把work也删了),上面不是建了一个abc.xml,把它重命名为ROOT.xml就ok了,把Tomcat跑起来

再说一下另外一种方法

上面配置虚拟目录时,最后说的方法是在server.xml中增加一行,现在呢你把path="/abc"改成path=""就行了。然后访问就可以了。




  • Tomcat多实例
一般是不是就跑了一个tomcat啊,可以多跑几个吧,你在C盘下装了一个tomcat,在D盘下也装了一个tomcat,把这两个都跑起来,是不是就是两个tomcat了(当然端口不能冲突啊)
除了装两个tomcat,还有没有办法跑两个呢,是有的,就是多实例啦。我现在的tomcat装在F: esourceapache-tomcat-8.0.37的,上面截图可以看到我没有指定端口,嗯,我想说的就是这个tomcat监听的端口是80。
现在我在桌面建一个文件夹,再把F: esourceapache-tomcat-8.0.37conf复制到这个文件夹中,然后把端口改一下(我改成了9090)

再在这个文件夹中新建一个bat文件,内容大致如下:
set "CATALINA_BASE=%cd%"
set "CATALINA_HOME=F:
esourceapache-tomcat-8.0.37"
set "EXECUTABLE=%CATALINA_HOME%incatalina.bat"
call "%EXECUTABLE%" start

嗯,就是下面这个样子了

简单解释一下,CATALINA_HOME就是你的Tomcat安装的位置,CATALINA_BASE就是你的这个实例的位置,默认的话这两个值是一样的。%cd%是什么东东呢
现在双击这个startup.bat
看到已经启动成功了,t1目录下也多了几个文件夹,现在t1就是一个tomcat实例了(现在访问是没有东西的,因为t1/webapps下什么都没有),你把web应用放到t1/webapps下一样的
再比如最上面我们在Tomcat安装目录conf[enginename][hostname]目录下弄了一个abc.xml,现在是不是应该到t1conf[enginename][hostname]目录下弄啦,嗯,一定是这样的。




到现在为止,老哥,稳。




  • MyEclipse中tomcat

他直接把你的应用复制到Tomcat安装目录下的webapps中,然后再把tomcat跑起来,没毛病。

默认这个Web Content-root和你的项目名是一样的,可以自己改,然后,唉,没有然后了,这图该有的都有了。
  • eclipse中tomcat

这个和MyEclipse不一样啊,他不是复制到webapps下面的,题主说不知道它部署去了哪里,其实这个很好搞到啊。在eclipse中新建一个web应用,然后弄一个jsp文件,内容见图,跑起来就知道它部署到哪里去了

啊,没错,它就在这个目录里面
然后再向上一点
是不是熟悉的面孔?我们把皮卡丘复制到这个webapps下面你说能访问不,很明显能啊对不对。这就是一个tomcat的实例嘛。
现在有一个问题,我们到在wtpwebapps下瞧瞧
可以看到这里面有两个,一个是我们的foo,还有一个ROOT,不过这个ROOT里面基本上什么都没有。如果我们的foo在webapps下,那没什么说的对吧,问题就在于它在wtpwebapps下啊,我们是如何访问到它的呢?去看一下这个tomcat实例的server.xml就知道了
这些东西都是eclipse的插件自己给我们搞的,这个问题完啦。
还有一个问题,eclipse是如何启动这个tomcat实例的,上面我们自己手动弄tomcat实例的时候弄了一个startup.bat文件,里面最主要就是配置了CATALINA_BASE对吧,那eclipse又是怎么搞的呢?这个问题先留着后面一起说。



  • Intellij IDEA中的Tomcat

和上面一样的办法可以搞到它部署到哪里去了

然后和eclipse一样,也搞了一个tomcat的实例,在下面这个地方
我这里最后一个目录叫Unnamed_JavaWeb,这个名字目测是这样的(具体我不知道),下划线后面的是项目的名字,啊,我建的这个项目就叫JavaWeb然后下划线前面的应该是配置Tomcat时给起的名字,默认是Unnamed然而我已经改成Tomcat8了啊,唉,不理了,反正不重要。
上面eclipse是怎么搞的,在server.xml下增加Context元素对吧,IDEA不是这样的,它是在conf[enginename][hostname]目录下增加xml文件。看上面的截图,我直接访问就可以了,这说明,他把我的这个名叫JavaWeb的应用弄成了默认的,按照上面说的,应该在conf[enginename][hostname]目录下增加一个ROOT.xml吧。啊,它就是这么搞的


  • IDE是如何启动tomcat实例的
在说eclipse的时候留的这个问题,Intellij IDEA也是一样的,它们是如何启动tomcat实例的。
set "CATALINA_BASE=%cd%"
set "CATALINA_HOME=F:
esourceapache-tomcat-8.0.37"
set "EXECUTABLE=%CATALINA_HOME%incatalina.bat"
call "%EXECUTABLE%" start

这是在干嘛啊,设置了CATALINA_HOME和CATALINA_BASE,然后用catalina.bat去吧tomcat跑起来。

可以看到这个CATALINA_BASE没有的话,它默认的值就是CATALINA_HOME对吧。
好,双击我们自己写的startup.bat把我们自己的tomcat实例跑起来,使用jps工具看一看启动参数,tomcat本身是一个Java程序,运行在Java虚拟机上的,所以你懂的。

在eclipse中启动tomcat
用jps看一看
在Intellij IDEA中启动tomcat
最开始也有输出啊
这个东西是catalina.bat里面输出的,后面红色的是Java日志输出的,然而eclipse那个控制台就显示了Java输出的东东。
再用jps看一眼吧
啊,写完了
其实 idea 启动的 tomcat 的过程很简单,看一下启动日志就都明白了,题主会有这样的疑惑主要是对 tomcat 不熟悉:
  1. 配置 CATALINA_BASE
  2. 启动 Tomcat

CATALINA_BASE是 tomcat 配置目录,具体可以看Tomcat官方文档 Apache Tomcat 8 (8.5.9) - Introduction,题主的问题也可以在里面得到解答,详情请看下面实例。



==============================分割线================================
  1. 下载一个全新的 tomcat 放在C:JavaTomcat-8080,不作任何修改,启动,默认端口8080

    此时webapps下的项目如下
  2. 在 idea 配置刚刚下载的 tomcat:

    部署项目并更改端口为8111:
  3. 启动 tomcat,观察启动日志(此时 tomcat 使用端口已经变成8111):


    这时候咱们打开 CATALINA_BASE这个目录看一下:



    没发现webapps,再回到 tomcat 的 webapps 目录,这时候可以看到原来的 ROOT 项目已经被配置换成实例中的 monitor 项目了



============================又一个分割线============================
所以,根据实例观察咱们可以得出以下结论:
idea 在启动 tomcat 的时候通过 CATALINA_BASE 修改了logs、conf和work的配置,webapps没动,如果没配置子域名就会自动覆盖原有的ROOT项目

最近写了一个tomcat的插件,支持社区版,特点就是不需要拷贝项目的web资源到其他目录,通过修改server.xml来配置contexpath和classpath。在不改变方法签名都可以做到热部署,不需要重启服务器。修改jsp也会自动更新的。

插件名叫smart tomcat,可以尝试一下,有问题可以反馈一下。
楼上 的回答挺详细的,我再来补充几个我踩过的坑
1. 在java文件夹下面的资源文件,如properties xml文件之类的资源 idea打war包部署的时候默认并不会加载,在article里面可以配置加载
2. tomcat配置的时候把两个更新都设置成update class and source 否则修改jsp文件或者freemarker之类的模板文件刷新浏览器不会有任何卵用
3. 对于maven项目,如果super pom文件中写了profile,直接启动会加载第一条,gradle项目同理会加载第一条task
4. 如果是maven或者gradle项目打jar包的时候别从article中配置,它会把所有的依赖也打进去,让你的jar包非常的大。正确的姿势是直接使用idea中相对应的插件,或者用批处理命令。
5. 用手机打这么多字,如果觉得有用请点个赞,有问题想咨询可以私信。
6. 以上
你在idwea里新建tomcat的时候,已经把tomcat的映射目录建好了,你可以用idea启动tomcat的时候,最开始的启动日志会打印你的tomcat新建目录,可以去看看配置!就算是eclipse/myeclipse 也不是直接拷贝你的项目到webapp目录下吧,我没有记错的话!很久没用这两个东西了。
原文地址:https://www.cnblogs.com/ziq711/p/8358809.html