转自https://blog.csdn.net/leo3070/article/details/88062663web
初次用idea的小白可能会很感到很神奇,intellij idea部署web项目在浏览器不须要输入项目名就能够直接访问,非常方便啊。那么 intellij 是如何实现这一功能的呢?在了解其原理以前须要掌握必定的知识哦。spring
咱们须要关注的是CATALINA_BASE与CATALINA_HOME的区别,这里虽然表示的路径是同样的,配置tomcat多实例的时候就会不同了(后面会说).apache
意思为 : CATALINA_HOME是Tomcat的安装目录,CATALINA_BASE是Tomcat的工做目录
目的在于 : 当你须要在一台机器上面部署多个Tomcat实例,可是你又不想建立多个Tomcat的副本,换句话说就是让这些Tomcat副本拥有本身的工做目录可是共享Tomcat的代码。(举个简单的例子,就比如你装了qq影音播放视频,你能够同时用QQ影音打开多个视频同时观看,这就是多实例,他们共享QQ影音这个主程序)浏览器
在Intellij中咱们给web工程部署到tomcat服务器的时候,咱们会有几个疑惑?
1. 为何咱们在tomcat的安装目录的webapps文件下找不到咱们的工程 ?
2. 为何咱们明明在tomcat安装目录下的conf/server.xml中配置了虚拟目录,部署项目后仍然找不到路径。(文件上传的时候须要配置虚拟目录接收上传的文件,不然浏览器是没法访问咱们上传的文件如图片等) 在intellij中应当如何配置虚拟目录呢?两种方式,后面会说 tomcat
首先解决第一个问题----------------------------------------------
通常来讲,intellij 会默认将web工程的输出到本工程目录下为out目录中, 也有的是target目录中。intellij idea使用Tomcat部署项目后并不会把编译后的项目复制到tomcat的webapps目录下,可是它会把编译好的项目路径告诉Tomcat,让Tomcat来找到这个项目,其它的项目好比Tomcat的主页项目ROOT是打不开的,由于intellij idea 只让Tomcat运行了一个项目.
每一个Tomcat实例都有一个配置ROOT.xml
文件, 路径/conf/Catalina/localhost/ROOT.xml
,内容以下:服务器
其中,path是指在访问此项目时,是否须要添加额外的路径,若是为空,则直接使用域名或者ip就能够访问到该项目:127.0.0.1。这个值在ieda中的Run/Debug Configurations中能够配置:mvc
docBase是指要运行的项目的部署位置,D:\work\项目
就是个人项目源代码的位置,target是由maven构建后生成的,D:\work\项目\target\xxx-web
目录就是maven build完成以后生成的项目,结构以下:app
就是这个文件告诉tomcat去哪里找编译后的项目,因此为何tomcat实例的webapps目录下没有项目文件。webapp
对于第二个问题 ----------------------------------------------
intellij idea中本身生成的tomcat实例存储路径以下:
C:\Users\{Username}\.IntelliJIdea2017.1\system\tomcat\Unnamed_{Product}_2\conf"
{Username}是你本机名,{Product}是你的工程名 jsp
你每次建的web项目都会分配一个独立的tomcat的实例,这里面conf文件夹下一样有一份tomcat配置文件,intellij在运行的时候用的就是这里的配置文件,这也是为何你在tomcat安装目录中配置虚拟目录不起做用的缘由了,吼吼!intellij 运行tomcat时只会依赖你安装目录中的lib和bin这两个文件夹中文件。
下面的是从intellij中部署项目到tomcat中所截取的一段日志
[2017-08-01 09:42:15,873] Artifact smvc:war exploded: Server is not connected. Deploy is not available.Using CATALINA_BASE:
"C:\Users\chenyuchao\.IntelliJIdea2017.1\system\tomcat\Unnamed_springmvc_2"
注意 ! ! !这里的catalina_base指向的再也不是tomcat的安装目录了,而是咱们项目所配置的tomcat实所在的目录。
首先在桌面上新建一个文件夹tomcat-ins,而后从tomcat的安装目录中复制一些必要的文件到咱们的文件夹,由于lib
和bin
这两个文件夹内容是全部tomcat实例共享的,不须要复制。
复制过来的文件稍微修改一下,清空一下webapps
,log
和work
目录内容,并手动建立三个启动tomcat实例的批处理文件
这些批处理文件内容以下
Tip :启动前在配置文件中修改一下相关的端口,这样多个tomcat启动就不会冲突
最后,部署一个项目到咱们的tomcat服务器上去,固然这里部署方式有不少种,最简单的就是部署到tomcat-ins/webapps目录下,可是貌似在浏览器访问就必须加项目名,吼吼!因此咱们仍是学习intellij部署项目的方式吧,那样咱们本身也能够随便改变访问根路径了!!!
第五步 :学习intellij,部署一个项目到咱们的tomcat实例
在tomcat-ins/conf/Catalina/localhost文件夹下(若是没有该目录,手动新建)新建一个xml文件
若是你想部署工程在跟目录下,url访问形同 http://localhost:8080/ 就能够直接访问index.jsp,这个xml文件的名字必须为ROOT.xml
, 着重强调,这里的root四个字母必须全大写
文件内容以下
说明 : path在这里必须为空字符,若是不是空字符串也不要紧,不会有影响,建议按照规范来!指的是浏览器访问的uri,docBase 指的是咱们项目所在的文件夹。
既然这里的docBase只要指向的是咱们的工程目录就能够随意设置,也就验证了intellij的项目输出目录没有部署到webapps下的缘由了
----------------------------------------------------------
若是你想部署工程在dir1下,url访问形同 http://localhost:8080/dir1就能够直接访问index.jsp,这个xml文件的名字必须为dir1.xml,也就是说xml的文件名与你的访问路径直接挂钩
文件内容以下
注意:这里的path规范化要与你的文件名一致,若是不一致,tomcat8仍会以文件名做为访问路径,忽略此path
----------------------------------------------------------
若是你想部署工程在dir1/dir2下,url访问形同 http://localhost:8080/dir1/dir2就能够直接访问index.jsp,这个xml文件的名字必须为dir1#dir2.xml,注意以#号分隔多层目录
文件内容以下
接着双击startCatalina.bat就能够启动咱们创建的tomcat实例了。
看看Intellij的localhost目录有什么,你就知道缘由了,intellij就是这样作的
错误的作法:上面咱们讲到,每一个web工程都配置了本身的tomcat配置文件夹,那么咱们去改它里面的conf/server.xml,在其host节点中添加一个
这样的虚拟目录配置。
结果天然也是无效的,由于每次intellij部署项目对应的tomcat实例就从新生成一边,图片中的文件所有删除再重建,因此咱们修改配置文件无效。
正确的作法:
方法1、intellij中添加虚拟目录
,纠正一下,图片中的服务器改成浏览器,看看结果
方法2、修改tomcat安装目录中server.xml文件,添加一条虚拟目录配置,再勾选以下配置
勾选上图,intellij就会在每次部署项目到tomcat上前,将对比本身生成的server.xml文件与tomcat安装目录下的server.xml文件不一样之处,两个文件合二为一,做为最终的tomcat配置文件