简单部署流程:

1,解析域名关联到服务器ip

2,配置服务器jre运行环境

3,安装tomcat

4,项目打war包,放入tomcat根目录下webapps(tomcat默认加载的项目目录)目录下

5,启动运行

Tomcat增加Context配置导致启动的时候项目加载两次

转自:https://segmentfault.com/a/1190000002985203

Tomcat排雷笔记

1. 出现场景
eclipse发布web应用至tomcat,默认方式下访问该项目是需要带项目名称的,例http://localhost:8080/myapp/
现在需要改成这样访问http://localhost
修改tomcat的server.xml文件,增加如下配置<Context path="" docBase="myapp" reloadable="false"/>,修改后host部分如下:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
--> <!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" /> <Context path="" docBase="myapp" reloadable="false"/> </Host>

此时每次启动tomcat观察日志都会发现应用加载了两次,什么原因呢?

2. 问题原因

虚拟目录引起的问题,我们在Host标签里配置了appBase="webapps",tomcat加载一次应用。在里配置了一次docBase,tomcat又去加载一次应用。

3. 解决办法

将appBase="webapps"置为appBase="",docBase="myapp"置为docBase="webapps/myapp"。配置如下:

<Host name="localhost"  appBase=""
unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
--> <!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" /> <Context path="" docBase="webapps/myapp" reloadable="false"/> </Host>

说明:如果你的项目中的链接或者图片写的都是绝对路径的话,那么带有项目名称的绝对路径是不可以使用的。作者这句话不明白什么意思,不懂这句话和上文有什么关联,一般情况下没人会在web项目中使用绝对路径吧,,如果本地绝对路径上的资源和服务器上保持同步的话应该可以使用吧。

tomcat 部署多个项目的技巧  

转自:https://segmentfault.com/a/1190000005942191

方法一、在tomcat的根目录下的 conf文件夹下的server.xml文件中的<Host>标签中加入:

//docBase: 项目的webRoot  path:访问路径  reloadable:是否每次都重新加载
<Context path="/PD_Microportal" docBase="E:\WorkSpace\PD_Microportal\WebContent" debug="0" reloadable="false"/>

然而上面对于多个项目的频繁切换就需要注释来注释去的很麻烦有木有!往下看还有更简单的....

方法二、在tomcat的根目录下的 conf\Catalina\localhost文件下新建xml文件,文件名就是你项目的的path,可以随意起,就是在浏览器上访问的路径名称。你想同时部署几个工程就创建几个xml 注意文件名别重名。然后把这个:

<Context path="" docBase="E:\WorkSpace\项目名称\WebContent" debug="0" reloadable="false"/>

放到你新建的xml文件中。例如:我有以下三个工程: OA、CRM、ERP,那么就需要有oa.xml、crm.xml、erp.xml。然后再新建一个文件夹tep(名字随意),这个文件夹用来存放不需要部署的项目的xml文件。比如:我现在不想部署OA这个项目,那么直接把oa.xml放到tep文件夹下就ok了,下次想部署了在拿出来就是了,有木有很方便呢!

tomcat配置自己的ROOT项目

当path为空时,访问localhost默认指向docBase指向的项目目录(在tomcat自动解压war包时自动把项目名称改为了ROOT)

<Context path="" docBase="E:\WorkSpace\项目名称\WebContent" debug="0" reloadable="false"/>

或者直接修改项目名字为ROOT,效果同上

我的部署最佳实践

忽略webapps目录和name为localhost的Host标签,直接配置我们自己的Host。

以下可能是通用的配置方案。

一个域名,多个项目的情景:

假如域名为www.domain.com

假如在c盘建立文件夹a和文件夹b,b目录下存放一个名为demo的项目。

注意:文件夹a最好不要放任何项目(避免Context中指定了相同的项目导致项目重复加载),文件夹b下放我们要部署的项目war包或已经解压过的项目。

配置如下:

<Host name="www.domain.com"  appBase="c:\a"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="c:\b\demo" reloadable="true"/>
</Host>

这样一个配置,当启动tomcat时,它首先去Host标签的appBase属性指定的c:\a目录下检查是否存在项目,如果是war包则自动解压(解压的目录为当前目录)并加载,如果是目录则直接加载。之后检查Context标签的docBase属性指定的c:\b\demo路径是一个项目目录还是一个war包,如果是一个项目目录那么直接加载,如果是一个war包,那么解压到appBase指定的目录下,再加载。另外注意这里context标签的path属性配置为空,如果demo是个war包的话解压时会以ROOT的去命名解压后的目录(如果path不为空,那么以path指定的字符串去命名)。

配置完成后,浏览器输入www.domain.com将访问到demo这个项目,这是因为path配置是空的。

如果新增了一个项目demo2,那么我们插入一个Context就可以了:

<Host name="www.domain.com"  appBase="c:\a"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="c:\b\demo" reloadable="true"/>
    <Context path="demo2" docBase="c:\b\demo2" reloadable="true"/>
</Host>

注意path不要重复。

多个域名,多个项目的情景:

我基于上个例子新增了文件夹c和文件夹d:

<Host name="www.domain.com"  appBase="c:\a"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="c:\b\demo" reloadable="true"/>
    <Context path="demo2" docBase="c:\b\demo2" reloadable="true"/>
</Host>
<Host name="www.domain2.com" appBase="c:\c"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="c:\d\demo" reloadable="true"/>
    <Context path="demo2" docBase="c:\d\demo2" reloadable="true"/>
</Host>

这种把项目分开管理的配置很灵活并且避免了项目重复加载的问题(除非你不小心配置了两个相同的项目)。

演示一下为什么会重复加载:

例如c盘下有文件夹p,里面存在项目demo

可能我们的配置如下:

<Host name="www.domain.com"  appBase="c:\p"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="demo" reloadable="true"/>
</Host>

项目的base目录在c盘的p目录,然后配置p目录下的demo为ROOT项目,看起来这么配置好像没什么问题,但启动的时候你会发现,demo这个项目被加载了两次,这是因为Host标签appBase属性指向的目录下的所有项目都会被加载,然后Context标签配置的docBase指定的项目又加载了一次。这就导致了重复加载,只要分开部署就可以解决这种问题了。

我们的服务器目录结构:

tomcat下部署项目的流程和遇到的问题笔记的更多相关文章

  1. linux下tomcat下部署项目如何打包压缩备份

    范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩![root ...

  2. 在tomcat下部署工程

    xx系统第一期工程完成,今天老大要我去部署系统,从来就没有在tomcat下部署过,一直都是在myeclipse下部署.启动.运行即可,所以这次遇到了几个问题,记录下来. tomcat启动 在安装tom ...

  3. JFinal 项目 在tomcat下部署

    原文:http://my.oschina.net/jfinal/blog/353062 首先明确一下 JFinal 项目是标准的 java web 项目,其部署方式与普通 java web 项目没有任 ...

  4. 在tomcat下部署两个或多个项目时 log4j和web.xml配置webAppRootKey 的问题(转)

    在tomcat下部署两个或多个项目时 web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为"webapp.root",如下: <!-- 应用路径 ...

  5. tomcat下部署了多个项目启动报错java web error:Choose unique values for the 'webAppRootKey' context-param in your web.xml files

    应该是tomcat下部署了多个项目且都使用log4j. <!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root". ...

  6. 一个Tomcat下部署多个项目异常:org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean 的解决方法

    内容简介 在测试服务器上Tomcat下部署两个Spring boot项目,总是一个能启动成功,另一个启动不成功.这两个war包单独部署均能正常启动. 查看日志:启动时报出 org.springfram ...

  7. Java Web开发: Tomcat中部署项目的三种方法

    web开发,在tomcat中部署项目的方法: 可以参考http://m.blog.csdn.net/blog/u012516903/15741727 定义$CATALINA_HOME指的是Tomcat ...

  8. eclipse maven项目中使用tomcat插件部署项目

    maven的tomcat插件部署web项目,我简单认为分两种,一种是部署到内置tomcat,另一种是部署到安装的tomcat. 第一种部署,默认是部署在内置tomcat的8080端口,如果不需要改端口 ...

  9. log4j和web.xml配置webAppRootKey 的问题(一个tomcat下部署多个应用)

    转自:http://blog.csdn.net/arvin_qx/article/details/6829873 在tomcat下部署两个或多个项目时,web.xml文件中最好定义webAppRoot ...

随机推荐

  1. docker容器时间不对及java程序时间不对解决

    使用docker容器部署的应用,会出现时间与主机不一致的情况 1. 容器时间与主机差8个小时:主机的与容器的/etc/localtime不一致 解决方法:挂载主机的/etc/localtime,如果没 ...

  2. pre 标签 防止 其撑开 div...

    pre 里面 的内容如果不换行,会导致 div 横向 出现 滚动条...加入下列 css可解决! pre{ white-space: pre-wrap; word-wrap: break-word; ...

  3. 74th LeetCode Weekly Contest Number of Subarrays with Bounded Maximum

    We are given an array A of positive integers, and two positive integers L and R (L <= R). Return ...

  4. Codeforces - 722C 区间合并

    要求断裂的数列之和的最大值,只需在断裂处的下标修改为一个足够负无穷大的值就可以用线段树维护 这道题数据还是弱了点,如果n和ai均取最大可能我这个程序早就爆ll了(4e4的时候炸了),毕竟本来想着用GC ...

  5. java mybatis学习一

    1.引入maven包 和 导入 sqljdbc包 <dependency> <groupId>org.apache.ibatis</groupId> <art ...

  6. EF上下文容器,保存线程唯一性

    在工作中有个疑问,就是EF上下文容器到底创建了多少个? 在asp.net中,EF上下文容器.如果只要有一个,则每次一个用户访问,添加一些实体,然后又不会自动销毁,就会造成内存爆炸.如果每次创建一个,则 ...

  7. Install ElasticSearch plugin for head

    git clone git://github.com/mobz/elasticsearch-head.git yum install git npm cd elasticsearch-head npm ...

  8. navicat premiun连接mysql数据库报错,错误代码:1251

    今天在电脑上安装了Mysql 8.0.11,然后想用 Navicat Premium连接数据库,结果报错了: error 1251:client does not support authentica ...

  9. jdk的环境配置

    今天在网上找了关于jdk配置的教程,发现比较繁琐,因此更新下jdk的简单配置教程 注意:jdk的安装必须正确,绝对不允许将jdk和jdr安装在同一层目录!!(建议在java目录下新建jdk和jdr目录 ...

  10. 数据结构---Java---HashSet

    1.概述 1.1 HashSet不是线程安全的: 1.2 当向HashSet存入元素时,调用该对象的hashCode()值,根据hashCode()值来决定元素的存储位置: 如果hashCode()值 ...