Tomcat 7中WAR文件中的上下文根配置

时间:2017-03-16 21:54:02

标签: java maven tomcat7 war

如何配置Tomcat 7以允许WAR文件指定自己的上下文根,而不是基于WAR文件名?示例:我有A-1.0.0.war和B-1.0.0.war,我想将它们都部署到同一个Tomcat实例。部署完成后,我想将浏览器指向localhost:8080 / portal并查看A-1.0.0.war中的内容,我想向localhost:8080 / rest / v1 / helloworld卷曲休息请求,其实现来自来自B-1.0.0.war。

我已经四处寻找并试图配置不同的方法,但这些都没有产生我上面所希望的场景。此外,我发现Tomcat文档有点太稀疏,无法完全理解。我读过:

  1. Tomcat 7 html manager howto
  2. Tomcat host config
  3. deploying-war-file-to-tomcat-with-a-different-path
  4. 在消化它们之后,在%CATALINA_HOME%/ conf / server.xml中我有这个单独的主机条目:

    <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true"
                deployXML="true" copyXML="true" >
        <Context path="/portal" docBase="/www/" reloadable="true" swallowOutput="true">
            <WatchedResource>WEB-INF/web.xml</WatchedResource>
            <Logger className="org.apache.catalina.logger.FileLogger" prefix="www-sample-com-log." suffix=".txt" timestamp="true"/>
        </Context>
        <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" />
    </Host>
    

    这是来自其中一个WAR文件的A.war / META-INF / context.xml的完整内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <Context path="/portal" docBase="ROOT/portal" />
    

    当我通过管理控制台部署到Tomcat时,我使用“WAR文件部署”按钮,但我没有指定“部署目录或位于服务器上的WAR文件”下的任何字段(因为我想要这些来自WAR本身,而不是让某人指定它)。当我打开webapps目录时,我看到了这个列表。我希望看到的不是A-1.0.0/目录,而是portal/

    A-1.0.0/
    B-1.0.0/
    docs/
    examples/
    host-manager/
    manager/
    ROOT/
    sample/
    A-1.0.0.war
    B-1.0.0.war
    sample.war
    

    如果它有帮助,这里是我的场景的一些背景故事。我的目标是将捆绑在单个.jar中的应用程序移动到两个.war文件中。目前,它是一个maven项目,它生成一个jar作为包含Spring MVC和JSP应用程序的构建工件。我的客户端正在使用java在命令行上启动应用程序。我想要的是在我们的开发服务器上安装Tomcat 7,有人可以通过Tomcat的管理控制台部署WAR文件。我还想在WAR的文件名中加上一个版本号,以便处理WAR的人员清楚他们正在部署什么。在每个构建/发布周期中,我希望它们取消部署旧战争并部署新战争。作为旁注 - 这是我第一次尝试将应用程序部署为战争,我可能已经错过了这样做的最佳实践,所以如果这不是一个好方法,请善意纠正我。

1 个答案:

答案 0 :(得分:0)

我个人不要使用manager应用程序来安装应用程序,我手动配置Tomcat,所以我不能说如何使用manager应用程序来实现它,但是这就是你的方式可以独立于war文件名控制应用程序上下文路径。

首先,不建议<Context>置于server.xml内(请参阅Tomcat documentation)。您应该在.../conf/Catalina/localhost文件夹中创建一个上下文XML文件。

所以,以下是步骤:

  1. 将war文件复制到系统的任何位置,但在Tomcat文件夹之外,例如/mywars/A-1.0.0.war

  2. 创建文件.../conf/Catalina/localhost/portal.xml

    <Context docBase="/mywars/A-1.0.0.war" reloadable="true" swallowOutput="true">
        <Logger className="org.apache.catalina.logger.FileLogger" prefix="www-sample-com-log." suffix=".txt" timestamp="true"/>
    </Context>
    

    请注意,它没有path属性。上下文路径由文件名确定,即/portal

  3. 如果需要,请重新启动Tomcat。

    我经常在进行更改之前关闭Tomcat,因此多次更改不会导致多次重新加载。

  4. 这样做时META-INF/context.xml不会被使用,即使存在也是如此。

    如果您的webapp使用通过<Parameter>元素内的<Context>元素配置的Servlet Init Parameters,您甚至可以在单个Tomcat实例中多次安装相同的webapp(war文件),通过在.../conf/Catalina/localhost文件夹中创建多个XML文件,每个配置不同的上下文路径。