• Intellij IDEA通过tomcat部署web项目的机制


    问题

    以前使用eclipse调用tomcat运行web项目时,eclipse的方式非常直接了当,就是直接将项目更新到%TOMCAT_HOME%/webapps目录下即可。然而在使用Intellij IDEA时,该目录下看不到任何项目文件,%TOMCAT_HOME%/conf/Catalina/localhost目录下也看不到任何项目配置文件,那么问题来了,web项目到底是如何部署到tomcat上的呢?

    思路

    通过仔细观察Intellij启动tomcat时的输出日志(MAC OS下),可以发现一些端倪。

    25-Oct-2016 17:14:10.698 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.0.33
    25-Oct-2016 17:14:10.744 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Mar 18 2016 20:31:49 UTC
    25-Oct-2016 17:14:10.745 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.0.33.0
    25-Oct-2016 17:14:10.746 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Mac OS X
    25-Oct-2016 17:14:10.747 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            10.11.1
    25-Oct-2016 17:14:10.748 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          x86_64
    25-Oct-2016 17:14:10.752 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home/jre
    25-Oct-2016 17:14:10.756 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_77-b03
    25-Oct-2016 17:14:10.757 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
    25-Oct-2016 17:14:10.765 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /Users/didi/Library/Caches/IntelliJIdea2016.1/tomcat/Unnamed_didi-code
    25-Oct-2016 17:14:10.766 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /opt/apache-tomcat-8.0.33
    25-Oct-2016 17:14:10.767 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/Users/didi/Library/Caches/IntelliJIdea2016.1/tomcat/Unnamed_didi-code/conf/logging.properties
    .....

    其中的关键在这句:

    CATALINA_BASE: /Users/didi/Library/Caches/IntelliJIdea2016.1/tomcat/Unnamed_didi-code

    CATALINA_BASE指向了一个目录(我的项目名为didi-code,应用上下文为code),在这个目录下有以下文件
    .
    ├── conf
    │ ├── Catalina
    │ │ └── localhost
    │ │ └── code.xml
    │ ├── catalina.policy
    │ ├── catalina.properties
    │ ├── context.xml
    │ ├── logging.properties
    │ ├── server.xml
    │ ├── tomcat-users.xml
    │ ├── web.xml
    │ └── web.xml.0
    ├── logs
    └── work
    └── Catalina
    └── localhost
    └── code

    这个目录和tomcat的配置目录很相似,那和我们的项目有什么关系呢?我们需要先从CATALINA_HOMECATALINA_BASE的区别入手。

    CATALINA_HOME与CATALINA_BASE

    简单的说,CATALINA_HOME是Tomcat的安装目录,CATALINA_BASE是Tomcat的工作目录。当我们想要运行多个Tomcat实例,但是不想拷贝多个Tomcat副本时,那么我们可以配置多个不同工作目录,在运行tomcat时对每个实例指派不同的工作目录,它们共享安装目录的运行文件(bin目录下)。

    这么看来CATALINA_BASE所指向的就是conf、logs、temp、webapps、work和shared目录。 而CATALINA_HOME则包括了Tomcat的二进制文件和脚本目录,也就是bin和lib目录。

    在我们解压tomcat压缩包后,这两个目录是混合在一起的,所以它们的路径是相同的。但当我们希望再运行另一个Tomcat实例时,那么我们可以再建立一个目录,把conf、logs、temp、webapps、work和shared拷贝到该目录下,然后在执行catalina.sh启动tomcat实例时指定或修改环境变量中的CATALINA_BASE路径即可。

    分析

    这时,我大致分析出了Intellij IDEA通过tomcat部署web项目原理了。

    首先Intellij会为每个web项目建立一个单独的文件夹,以“Unnamed_项目名”命名(可在.idea/workspace.xml中修改)。在每次启动项目时,它先将tomcat目录下原始的CATALINA_BASE目录拷贝一份到该目录下,也就是将当前tomcat的配置文件拷贝到“Unnamed_项目名”文件夹下。然后将CATALINA_BASE的路径修改为该目录的路径,再在 Unnamed_项目名/conf/Catalina/localhost下添加项目的配置文件,如 code.xml,内容为

    <?xml version="1.0" encoding="UTF-8"?>
    <Context path="/code" docBase="/Users/didi/project/CODE-PROJ/didi-code-web/target/code" />

    最后启动tomcat,tomcat除了会启动webapps下应用外还会加载/conf/Catalina/localhost下配置的应用,而Intellij就是通过这种方式“隐蔽”地加载web项目。

    看到这儿你可能还会发现为什么在tomcat安装目录下始终找不到项目log文件的原因了,因为CATALINA_BASE指向了/Users/didi/Library/Caches/IntelliJIdea2016.1/tomcat/Unnamed_didi-code,所以指定相对路径${catalina.base}的log文件就存在了该目录下。

  • 相关阅读:
    前台隐藏或者看不见
    关于线程安全
    JAVA中的length属性和length()方法和size()方法的区别
    内存泄露和内存溢出
    配置tomcat,只需要启动一次
    ThickBox关闭本页,刷新父页
    Myeclipse断点问题
    解决windows远程(Telnet)最大连接数的问题
    父页刷新的方法
    Jsp页面大小写转换
  • 原文地址:https://www.cnblogs.com/jpfss/p/8550891.html
Copyright © 2020-2023  润新知