Intellij idea 的tomcat原理讲解

初次用idea的小白可能会很感到很神奇,intellij idea部署web项目在浏览器不需要输入项目名就可以直接访问,很是方便啊。那么 intellij 是如何实现这一功能的呢?在了解其原理之前需要掌握一定的知识哦。

第一步 : 在本机上配置tomcat服务器,小白看看吧

首先:添加系统变量 CATALINA_HOME : C:\apache-tomcat-8.0.41 
其次:添加环境变量 path : %CATALINA_HOME%\bin 
-------------------------------------------------------------- 
启动 tomcat 服务器,打开你的cmd,输入以下命令 
catalina  run    启动,在原窗口启动 
catalina  start   启动,会打开一个新的dos窗口启动 
catalina  stop   停止tomcat服务器

第二步 : 看看简短的启动信息,对于理解intellij的tomcat很关键

C:\Users\chenyuchao>catalina start 
Using CATALINA_BASE: “C:\apache-tomcat-8.0.42” 
Using CATALINA_HOME: “C:\apache-tomcat-8.0.42” 
Using CATALINA_TMPDIR: “C:\apache-tomcat-8.0.42\temp” 
Using JRE_HOME: “C:\Java\jdk1.8.0_101”

我们需要关注的是CATALINA_BASE与CATALINA_HOME的区别,这里虽然表示的路径是一样的,配置tomcat多实例的时候就会不一样了(后面会说).

官方解释】 
Throughout the docs, you’ll notice there are numerous references to CATALINA_HOME. This represents the root of your Tomcat installation. When we say, “This information can be found in your CATALINA_HOME/README.txt file” we mean to look at the README.txt file at the root of your Tomcat install. Optionally, Tomcat may be configured for multiple instances by defining CATALINA_BASE for each instance. If multiple instances are not configured, CATALINA_BASE is the same as CATALINA_HOME.

意思为 : CATALINA_HOME是Tomcat的安装目录,CATALINA_BASE是Tomcat的工作目录 
目的在于 : 当你需要在一台机器上面部署多个Tomcat实例,但是你又不想创建多个Tomcat的副本,换句话说就是让这些Tomcat副本拥有自己的工作目录但是共享Tomcat的代码。(举个简单的例子,就好比你装了qq影音播放视频,你可以同时用QQ影音打开多个视频同时观看,这就是多实例,他们共享QQ影音这个主程序)

第三步 : Intellij idea 的基于我们给tomcat创建了新的实例

在Intellij中我们给web工程部署到tomcat服务器的时候,我们会有几个疑惑? 
1. 为什么我们在tomcat的安装目录的webapps文件下找不到我们的工程 ? 
2. 为什么我们明明在tomcat安装目录下的conf/server.xml中配置了虚拟目录,部署项目后仍然找不到路径。(文件上传的时候需要配置虚拟目录接收上传的文件,否则浏览器是无法访问我们上传的文件如图片等) 在intellij中应当如何配置虚拟目录呢?两种方式,后面会说 

首先解决第一个问题---------------------------------------------- 
一般来说,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中可以配置:

Intellij idea 的tomcat原理讲解_第1张图片

docBase是指要运行的项目的部署位置,D:\work\项目 就是我的项目源代码的位置,target是由maven构建后生成的,D:\work\项目\target\xxx-web 目录就是maven build完成之后生成的项目,结构如下:

Intellij idea 的tomcat原理讲解_第2张图片

就是这个文件告诉tomcat去哪里找编译后的项目,所以为什么tomcat实例的webapps目录下没有项目文件。


对于第二个问题  ---------------------------------------------- 
intellij idea中自己生成的tomcat实例存储路径如下: 
C:\Users\{Username}\.IntelliJIdea2017.1\system\tomcat\Unnamed_{Product}_2\conf" 
{Username}是你本机名,{Product}是你的工程名 
Intellij idea 的tomcat原理讲解_第3张图片

你每次建的web项目都会分配一个独立的tomcat的实例,这里面conf文件夹下同样有一份tomcat配置文件,intellij在运行的时候用的就是这里的配置文件,这也是为什么你在tomcat安装目录中配置虚拟目录不起作用的原因了,吼吼!intellij 运行tomcat时只会依赖你安装目录中的lib和bin这两个文件夹中文件。 
Intellij idea 的tomcat原理讲解_第4张图片

下面的是从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实例

首先在桌面上新建一个文件夹tomcat-ins,然后从tomcat的安装目录中复制一些必要的文件到我们的文件夹,因为libbin这两个文件夹内容是所有tomcat实例共享的,不需要复制。  
Intellij idea 的tomcat原理讲解_第5张图片

复制过来的文件稍微修改一下,清空一下webappslogwork目录内容,并手动创建三个启动tomcat实例的批处理文件 
Intellij idea 的tomcat原理讲解_第6张图片

这些批处理文件内容如下

runCatalina.bat的代码如下 ,,,,,在当前控制台启动 %cd%代表当前目录

set “CATALINA_BASE=%cd%” 
set “EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat” 
call “%EXECUTABLE%” run 
---------------------------------------------------------- 
startCatalina.bat的代码如下,,,,,新开dos窗口启动

set “CATALINA_BASE=%cd%” 
set “EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat” 
call “%EXECUTABLE%” start 
---------------------------------------------------------- 
stopCatalina.bat的代码如下,,,,,关闭tomcat服务器

set “CATALINA_BASE=%cd%” 
set “EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat” 
call “%EXECUTABLE%” stop 
pause

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就是这样做的 
Intellij idea 的tomcat原理讲解_第7张图片

附加 : Intellij idea上部署虚拟目录,解决文件上传问题

错误的做法:上面我们讲到,每个web工程都配置了自己的tomcat配置文件夹,那么我们去改它里面的conf/server.xml,在其host节点中添加一个 
这里写图片描述

这样的虚拟目录配置。 
结果自然也是无效的,因为每次intellij部署项目对应的tomcat实例就重新生成一边,图片中的文件全部删除再重建,所以我们修改配置文件无效。 
Intellij idea 的tomcat原理讲解_第8张图片

正确的做法: 
方法一、intellij中添加虚拟目录 
Intellij idea 的tomcat原理讲解_第9张图片 
Intellij idea 的tomcat原理讲解_第10张图片 
,纠正一下,图片中的服务器改为浏览器,看看结果 
Intellij idea 的tomcat原理讲解_第11张图片

方法二、修改tomcat安装目录中server.xml文件,添加一条虚拟目录配置,再勾选如下配置 
Intellij idea 的tomcat原理讲解_第12张图片

勾选上图,intellij就会在每次部署项目到tomcat上前,将对比自己生成的server.xml文件与tomcat安装目录下的server.xml文件不同之处,两个文件合二为一,作为最终的tomcat配置文件

你可能感兴趣的:(IntelliJ,Idea,tomcat)