设为首页 收藏本站
查看: 479|回复: 0

[经验分享] Tomcat部署关联项目

[复制链接]

尚未签到

发表于 2017-1-22 08:20:52 | 显示全部楼层 |阅读模式
一:Tomcat5.5  部署web项目源码详解
Tomcat.5.5.16 安装 web 项目时执行的代码主要是 HostConfig 类,其中 deployApps() 执行部署 web 应用的功能;
protected void deployApps() {
        File appBase = appBase();
        File configBase = configBase();
        // Deploy XML descriptors from configBase
        deployDescriptors(configBase, configBase.list());
        // Deploy WARs, and loop if additional descriptors are found
        deployWARs(appBase, appBase.list());
        // Deploy expanded folders
        deployDirectories(appBase, appBase.list());
      
    }
从上面这段代码,我们可以知道 tomcat 在部署 web 项目是按如下顺序依次部署的;
1.首先部署 $CATALINA_HOME/conf/Catalina/localhost 目录下面的 .xml 文件
deployDescriptors(configBase, configBase.list());
(1)configBase 的值是通过调用 configBase() 获取的,
     File file = new File(System.getProperty("catalina.base"), "conf");
        Container parent = host.getParent();
        if ((parent != null) && (parent instanceof Engine)) {
            file = new File(file, parent.getName());
        }
file = new File(file, host.getName());

可以看出 configBase 是由四部分内容组成 ;
System.getProperty("catalina.base") + “conf” + parent.getName()+host.getName()
parent.getName() 和 host.getName() 是分别取 server.xml 中
<Engine name="Catalina" defaultHost="localhost"> 和
<Host name="localhost" appBase="webapps" … 对应的 name 属性值;
由此可以得出 configBase 的值为 $CATALINA_HOME/conf/Catalina/localhost
     (2) 按文件名顺序依次读取 configBase 目录下面的 xml 文件部署 web 应用;
            第一步,首先获取文件名(不包含 .xml )作为上下文路径
    String nameTmp = files.substring(0, files.length() - 4);
                String contextPath = "/" + nameTmp.replace('#', '/');

            第二步,解析 xml 文件,分析 docBase 的值;
    注意这里的 docBase 的判断很重要,采用和以前版本完全不同的做法;
                    if (!docBase.isAbsolute()) {
                        docBase = new File(appBase(), context.getDocBase());
                     }
                  首先判断 docBase 是否为绝对路径,如果不是绝对路径,在改为
                       $CATALINA_HOME/webapps+docBase
  
                     // If external docBase, register .xml as redeploy first
                    if(!docBase.getCanonicalPath().startsWith(appBase().getAbsolutePath()))
{
// 这个判断很重要,这里是判断如果 docBase 路径是以
$ CATALINA_HOME/webapps+docBase 开头的字符串,则忽略掉了
                          isExternal = true;
                           ...
                       if (docBase.getAbsolutePath().toLowerCase().endsWith(".war")) {
                             isWar = true;
                       }
                   } else{
       // Ignore specified docBase
     context.setDocBase(null);
}
从上面可以看出, <Context path="/xxxx" docBase="xxxx" . 中 docBase 只有为绝对路径并且该路径不是以 $CATALINA_HOME/webapps 开头,才会生效;否则就忽略掉了
2.接下来部署 $CATALINA_HOME/webapps/ 目录下以。 War 结尾的文件
deployWARs(appBase, appBase.list());
(1) 首先仍是把文件名 ( 不用 .war) 作为其应用的上下文路径 ;

if (files.toLowerCase().endsWith(".war")) {
                // Calculate the context path and make sure it is unique
                String contextPath = "/" + files;
                int period = contextPath.lastIndexOf(".");

        (2) 接下来判断以该上下文路径 contextPath 是否已经装载过了,如果是则直接退出;    if (deploymentExists(contextPath))
                     return;
       ( 3 ) 继续判断以该上下文命名的部署文件是否存在,如 war 文件为 AAA.war, 则判断在 $CATALINA_HOME/conf/Catalina/localhost/AAA.xml 文件是否存在,如果不存在继续执行以下操作;
          File xml = new File
            (configBase, file.substring(0, file.lastIndexOf(".")) + ".xml");
        if (deployXML && !xml.exists()) {
          entry = jar.getJarEntry(Constants.ApplicationContextXml);
          configBase.mkdirs();
          。。。

      先从 wart 文件中读取 META-INF/context.xml 文件,然后把它 copy 到
      $CATALINA_HOME/conf/Catalina/localhost/AAA.xml, 注意 war 文件部署文件必须为
context.xml ,且在 META-INF 目录下;   
( 4 )接下来操作和上面类似,部署该 web 应用;

3. 最后是以 $CATALINA_HOME/webapps 目录下的文件夹为目标按文件夹名顺序进行部署

deployDirectories(appBase, appBase.list());
(1)同样先把该文件夹名作为上下文路径进行部署;
           File dir = new File(appBase, files);
            if (dir.isDirectory()) {
                // Calculate the context path and make sure it is unique
                String contextPath = "/" + files;


(2)接下来的步骤就基本上是一样了,首先判断该上下文路径是否已经部署过,如果是则直接退出,否则和上面一样,读取 META-INF/context.xml 文件进行部署;
注意这里和上面的 war 文件部署稍微有点不同,就是它不会 copy 部署文件 context.xml 文件到 $CATALINA_HOME/conf/Catalina/localhost 中去;
以上转自http://hi.baidu.com/iameyama/blog/item/d89234b1450b95530923020a.html
二:Tomcat关联项目
1.创建了一个简单的Web项目,项目的目录结构如下:
ConfigureTomcat
   ----src
   ----JRE System Library
   ----build
   ----WebContent
       ------lib
   ----index.jsp
2.方法一:
   1)新建一个名为ConfigureTomcat.xml的配置文件,内容如下:
   <?xml version='1.0' encoding='utf-8' ?>
<Context docBase="E:\workspace\ConfigureTomcat" path="/WebContent" debug="0" reloadable="true"></Context>

   2)将此文件放到Tomcat安装目录中的conf\Catalina\localhost下面;
   3)启动Tomcat5之后,在浏览器中输入http://localhost:8080/ConfigureTomcat/WebContent/index.jsp  即可显示其中内容。
   方法二:将项目拷贝到webapps的目录下面:
      在浏览器中输入http://localhost:8080/ConfigureTomcat/WebContent/index.jsp  即可显示其中内容。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-331753-1-1.html 上篇帖子: Tomcat下乱码问题 下篇帖子: Eclipse Tomcat远程调试配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表