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.3325-Oct-2016 17:14:10.744 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Mar 18 2016 20:31:49 UTC25-Oct-2016 17:14:10.745 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.0.33.025-Oct-2016 17:14:10.746 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Mac OS X25-Oct-2016 17:14:10.747 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            10.11.125-Oct-2016 17:14:10.748 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          x86_6425-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/jre25-Oct-2016 17:14:10.756 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_77-b0325-Oct-2016 17:14:10.757 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation25-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-code25-Oct-2016 17:14:10.766 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /opt/apache-tomcat-8.0.3325-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文件就存在了该目录下。

原文地址:https://www.cnblogs.com/jpfss/p/8550891.html

时间: 2024-12-13 21:24:16

Intellij IDEA通过tomcat部署web项目的机制的相关文章

利用Tomcat部署Web项目报错

1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help | start | stop } 八月 18, 2014 7:35:40 下午 org.apache.catalina.core.AprLifecycleListener init 信息: Loaded APR based Apache Tomcat Native library 1.1.24 u

tomcat 部署web项目

TOMCAT 部署web项目 方法介绍 操作前,先来了解一下Tomcat的目录结构. (适用于Tomcat 6.0,Tomcat7.0)    Tomcat下有7个目录,分别是bin,conf,lib,logs,temp,webapps,work 目录,现在对每一目录做介绍. Tomcat根目录在tomcat中叫<CATALINA_HOME>,      1.<CATALINA_HOME>/bin:        存放各种平台下启动和关闭Tomcat的脚本文件.      2.&l

eclipse,tomcat部署web项目,以及本地文件访问

1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的一种Tomcat项目部署的方法,也是初学者最常用的方法. 2.在tomcat安装目录中有一个conf文件夹,打开此文件夹,其中包含配置文件server.xml,打开配置文件,并在<host>和</host>之间插入如下语句. <Context path="/hello" docBase="F:\eclipse3.2\workspace\hello\WebRoot"

Tomcat部署web项目

在Myeclipse中,我们很容易做到这一步:把一个web项目生成war文件 其实在eclipse中,实现这样的功能,也是很简单的. 下面就看一下是怎样操作的吧! 新建一个web项目: 取名为:eclipse4war(项目名字可以酌情而定) 项目-->右键 export-- > WAR file 点击Browse... 选择一个存放war文件的路径 你可以使用CMD或者在电脑上找到startup.bat文件. 启动tomcat 打开浏览器,输入http://localhost:8080/, 然

Tomcat部署web项目常用方式

# web项目部署到tomcat方式总结 一:web项目最终的发布结构为:项目名为Env eclipse中项目结构图: eclipse export出的war包:上层目录为Env  文本说明: Env META-INF WEB-INF lib calsses web.xml 二:web.xml 配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.

tomcat部署web项目的三种方式

一.利用webapps文件夹自动部署 这是最简单的方式,只要将网站直接拷贝到:tomcat根目录下的webapps文件夹里 举例:helloworld文件夹下创建里index.html文件,然后把helloworld文件夹移动到tomcat根目录下webapps文件夹里,重启tomcat. 打开浏览器在原tomcat网址后面加上/helloworld就会自动打开网站 如果不想?在访问我们的项目内容时,必须加上我们的项目名字"helloworld",如果不想这样可以编辑conf/serv

百度开放云java+tomcat部署web项目-小皇帝詹姆斯

加入部署 复制svn地址,在本地checkout出来,打包自己的web项目并改名为ROOT.war,svn提交上去后,点击快捷公布,公布成功后稍等1-3秒点击域名就能够直接訪问自己的小项目啦! 项目结构图: http://kingjames.duapp.com/这是一个小皇帝詹姆斯的一个介绍案例,部分截图例如以下

Tomcat部署web项目【转】

操作前,先来了解一下Tomcat的目录结构. (适用于Tomcat 6.0,Tomcat7.0) Tomcat下有7个目录,分别是bin,conf,lib,logs,temp,webapps,work 目录,现在对每一目录做介绍. Tomcat根目录在tomcat中叫<CATALINA_HOME>, 1.<CATALINA_HOME>/bin:        存放各种平台下启动和关闭Tomcat的脚本文件. 2.<CATALINA_HOME>/lib:        

Tomcat部署web项目,虚拟目录,上下文(Context),WEB-INF,web.xml,servlet

Web项目的uri模型大致如下: http://localhost:8080 (/context) (/resource) 站点/上下文/资源 一. Tomcat中指定上下文(Context) 方法一,位于webapps文件夹中的web项目,无需指定Context,Tomcat默认解析为该web项目根文件夹的名称,即为真实目录名称. 方法二,在server.xml中指定Context. 编辑conf\server.xml文件,在元素之间加入子元素,内容如下: <Context docBase=”