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

Java Tomcat 7中WAR文件中的上下文根配置,java,maven,tomcat7,war,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中的内容,并且我希望将rest请求卷曲到localhost:8080/rest/v1/helloworld,其实现来自B-1.0.0.war 我四处搜寻并尝试配置不同的方式,但没有一种能够产生我想要的上述场景。此外,

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

我四处搜寻并尝试配置不同的方式,但没有一种能够产生我想要的上述场景。此外,我发现Tomcat文档有点过于稀疏,无法完全理解。我读过:

  • 消化这些内容后,在%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>
    

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

    我个人不使用
    管理器
    应用程序来安装应用程序,我手动配置Tomcat,因此,我不能说如何使用
    manager
    app来实现这一点,但这里介绍了如何独立于war文件名来控制app上下文路径

    首先,不建议将
    放在
    server.xml
    中(请参阅)。您应该在
    ../conf/Catalina/localhost
    文件夹中创建上下文XML文件

    因此,以下是步骤:

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

  • 创建文件
    ../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

  • 如果需要,重新启动Tomcat

    我通常在进行更改之前关闭Tomcat,所以多次更改不会导致多次重新加载

  • 这样做时,即使存在,也不使用META-INF/context.xml


    如果您的webapp使用Servlet Init参数(您使用
    元素中的
    元素进行配置),那么您甚至可以在单个Tomcat实例中的不同上下文路径下多次安装相同的webapp(war文件),每个路径的配置都不同,只需在
    ../conf/Catalina/localhost
    文件夹中创建多个XML文件。

    谢谢您的回答。这揭示了我完全遗漏的一点,即Tomcat将在其
    conf/Catalina/localhost/
    文件夹中查找xml文件。现在我明白了
    conf//
    在文档中的含义。我明天回去工作时会试试这个。但我还有一个问题-如果下个月我想在旧的1.0.0版本上部署一个-2.0.0.war,我是否需要添加另一个
    (或更改现有的一个)以匹配新war文件的名称?现在我认为将版本号放在WAR文件名中是个坏主意……除非您想使用不同的上下文路径保持两个版本都运行,否则只需更新现有xml文件的
    docBase
    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
    
    <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>