在 WAR 文件中定义 Servlet 上下文

2022-09-01 14:16:55

例如,我如何告诉Tomcat在给定我的WAR文件时使用特定的上下文路径?

示例:我有一个由maven build创建的war文件,并且该文件的结果名称很长。因此,我不希望 tomcat 管理器应用程序使用战争的文件名作为上下文。

在 META-INF 中提供上下文.xml未产生所需的结果

我还在以下属性的文档中找到了这一点:pathContext

除非在服务器.xml中静态定义上下文,否则不得设置此字段的值,因为它将从用于.xml上下文文件或 docBase 的文件名中推断出来。

因此,这似乎不是告诉应用程序服务器我的WAR的路径应该是什么的正确方法。

还有其他提示吗?


答案 1

上下文容器的文档中有两个要点:

  • 在目录中的单个文件(扩展名为“.xml”)中。文件名(减去.xml扩展名)将用作上下文路径。可以使用 # 定义多级上下文路径,例如 foo#bar.xml 表示 /foo/bar 的上下文路径。默认 Web 应用程序可以通过使用名为 ROOT.xml 的文件来定义。$CATALINA_BASE/conf/[enginename]/[hostname]/
  • 仅当应用程序中的上下文文件不存在时,在应用程序文件内部的单个文件中。如果 Web 应用程序打包为 WAR,则 /META-INF/context.xml 将被复制到 $CATALINA_BASE/conf/[enginename]/[hostname]/ 并重命名以匹配应用程序的上下文路径。一旦此文件存在,如果将具有更新值的新 WAR 放置在主机的 appBase 中,则不会替换此文件。$CATALINA_BASE/conf/[enginename]/[hostname]//META-INF/context.xml/META-INF/context.xml

因此,当您捆绑 a 时,文件将重命名为 WAR 的名称,并且此名称将成为上下文路径,而不管元素中定义了什么。META-INF/context.xmlpathContext

因此,我在这里看到两个选项:

  1. 要么将生成的战争的名称设置为较短的名称(我建议使用已弃用的AFAIK):<finalName><warName>

    <project>
      ...
      <build>
        <finalName>mycontext</finalName>
        ...
      </build>
      ...
    </project>
    
  2. 或者使用 maven-tomcat-plugin 进行部署,并在插件配置中设置上下文路径:

    <project>
      ...
      <build>
        ...
        <plugins>
          ...
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>tomcat-maven-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
            <configuration>
              <path>/mycontext</path>
            </configuration>
          </plugin>
          ...
        </plugins>
        ...
      </build>
      ...
    </project>
    

答案 2

我找到了一个简单的解决方案来保留war文件名并选择上下文路径。

你只需要在主机之外部署你的战争,并在目录内创建一个链接。appBaseappBase

前任。:

ln -sf ${CATALINA_HOME}/wars/myapp-0.0.8-SNAPSHOT.war ${CATALINA_HOME}/webapps/myapp.war

埃克托


推荐