zoukankan      html  css  js  c++  java
  • Intellij idea 的tomcat原理讲解

    ------------恢复内容开始------------

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

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

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

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

    C:Userschenyuchao>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 emp”
    Using JRE_HOME: “C:Javajdk1.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中应当如何配置虚拟目录呢?两种方式,后面会说
    3. 如何去配置intellij在浏览器中的访问路径?

    首先解决第一个问题----------------------------------------------
    一般来说,intellij 会默认将web工程的输出到本工程目录下为out目录中, 原理后面说。
    对于第二个问题  ----------------------------------------------
    intellij idea中自己生成的tomcat实例存储路径如下:
    C:Users{Username}.IntelliJIdea2017.1system omcatUnnamed_{Product}_2conf"
    {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:Userschenyuchao.IntelliJIdea2017.1system omcatUnnamed_springmvc_2"

    注意 ! ! !这里的catalina_base指向的不再是tomcat的安装目录了,而是我们项目所配置的tomcat实所在的目录。

    第四步 : 为了更好的理解,自己动手配置一个tomcat实例

    首先在桌面上新建一个文件夹tomcat-ins,然后从tomcat的安装目录中复制一些必要的文件到我们的文件夹,因为libbin这两个文件夹内容是所有tomcat实例共享的,不需要复制。
    这里写图片描述
    复制过来的文件稍微修改一下,清空一下webappslogwork目录内容,并手动创建三个启动tomcat实例的批处理文件
    这里写图片描述
    这些批处理文件内容如下

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

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

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

    set “CATALINA_BASE=%cd%”
    set “EXECUTABLE=%CATALINA_HOME%incatalina.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上部署虚拟目录,解决文件上传问题

    错误的做法:上面我们讲到,每个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>在confcatalinalocalhost中有个smvc.xml配置文件,加载的是项目B,

    <3>在confserver.xml有个context配置,path为/smvc,加载的是项目C,

    那么我们在浏览器中输入http://localhost:8080/smvc 访问的是哪一个项目呢 ?

    答案:访问的是项目C,

    三种方式拥有的优先级顺序是 <3>大于<2>,<2>大于<1>

    ------------恢复内容结束------------

  • 相关阅读:
    [转载]微软4月13日发布Silverlight 4
    关于文件流Seek以及Read操作的一点不满
    团队基础生成自动化流程之最佳实践(IV) 重写团队基础默认生成流程
    谁是你的下一行CODE
    团队基础生成自动化流程之最佳实践总论(II) – 程序集版本信息
    微软Visual Studio 2010 第三集:幸福要敏捷
    团队基础生成自动化流程之最佳实践(VI) 系统模块化条件编译
    团队基础生成自动化流程之最佳实践(V) 使用Desktop Build
    VS2010 "内存不足" 错误补丁
    彩虹天堂
  • 原文地址:https://www.cnblogs.com/wl-blog/p/13758073.html
Copyright © 2011-2022 走看看