作者: 陈宇超 纪念卓越班的日子
初次用idea的小白可能会很感到很神奇,intellij idea部署web项目在浏览器不需要输入项目名就可以直接访问,很是方便啊。那么 intellij 是如何实现这一功能的呢?在了解其原理之前需要掌握一定的知识哦。
首先:添加系统变量 CATALINA_HOME : C:\apache-tomcat-8.0.41
其次:添加环境变量 path : %CATALINA_HOME%\bin
--------------------------------------------------------------
启动 tomcat 服务器,打开你的cmd,输入以下命令
catalina run 启动,在原窗口启动
catalina start 启动,会打开一个新的dos窗口启动
catalina stop 停止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中我们给web工程部署到tomcat服务器的时候,我们会有几个疑惑?
1. 为什么我们在tomcat的安装目录的webapps
文件下找不到我们的工程 ?
2. 为什么我们明明在tomcat安装目录下的conf/server.xml
中配置了虚拟目录,部署项目后仍然找不到路径。(文件上传的时候需要配置虚拟目录接收上传的文件,否则浏览器是无法访问我们上传的文件如图片等) 在intellij中应当如何配置虚拟目录呢?两种方式,后面会说
3. 如何去配置intellij在浏览器中的访问路径?
首先解决第一个问题----------------------------------------------
一般来说,intellij 会默认将web工程的输出到本工程目录下为out目录中, 原理后面说。
对于第二个问题 ----------------------------------------------
intellij idea中自己生成的tomcat实例存储路径如下:
C:\Users\{Username}\.IntelliJIdea2017.1\system\tomcat\Unnamed_{Product}_2\conf"
{Username}是你本机名,{Product}是你的工程名
你每次建的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实例的批处理文件
这些批处理文件内容如下
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部署项目的方式吧,那样我们自己也可以随便改变访问根路径了!!!
在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实例就重新生成一边,图片中的文件全部删除再重建,所以我们修改配置文件无效。
正确的做法:
方法一、intellij中添加虚拟目录
,纠正一下,图片中的服务器改为浏览器,看看结果
方法二、修改tomcat安装目录中server.xml文件,添加一条虚拟目录配置,再勾选如下配置
勾选上图,intellij就会在每次部署项目到tomcat上前,将对比自己生成的server.xml文件与tomcat安装目录下的server.xml文件不同之处,两个文件合二为一,作为最终的tomcat配置文件
<1>现在有一种情况就是在webapps中有一个项目A ,文件夹名smvc
<2>在conf\catalina\localhost中有个smvc.xml配置文件,加载的是项目B,
<3>在conf\server.xml有个context配置,path为/smvc,加载的是项目C,
那么我们在浏览器中输入http://localhost:8080/smvc 访问的是哪一个项目呢 ?
答案:访问的是项目C,
三种方式拥有的优先级顺序是 <3>大于<2>,<2>大于<1>