繁体   English   中英

将战争应用程序名称与战争文件名分开

[英]Separating war application name from war file name

目前,如果我在 tomcat 上部署一个名为myapp.war的战争文件,我可以通过http://localhost/myapp/MyServlet 访问它的 url

但是我想要的是部署一个战争文件名中带有版本号的战争,并且仍然具有相同的 url。 例如,我想部署myapp-1.1.0.war并且仍然让 url 成为http://localhost/myapp/MyServlet

当然我需要不断更新战争,版本号会不断变化,所以我不能在任何地方硬编码战争文件名。 web.xml中是否有任何设置可以用来为应用程序保留相同的 url,而不管战争文件名如何?

解决方法是停止使用 Tomcat 的自动部署功能,该功能采用将“上下文名称”(URL 的/myapp部分)设置为“.war”之前的 WAR 文件名部分的快捷方式。

相反,自己将 WAR 内容提取到文件系统并在TOMCAT_HOME/conf/[enginename]/[hostname]/[contextname].xml中设置一个 XML 文件,它将所需的上下文路径(例如/myapp )指向磁盘上的应用程序(例如/opt/webapps/myapp-1.1.0/ )。

Tomcat 参考文档很好地解释了 Tomcat 如何自动部署应用程序,以及如何配置自定义逻辑以将上下文路径映射到应用程序文件位置(除了我建议的方法之外,还有一些替代方法可以设置它以上)。

您可以为此使用 YOUR_WAR/META-INF/context.xml。 这是一个示例:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/MyServlet"/>

使用Maven时,您可以通过执行以下操作来控制部署路径:

Tomcat的conf/tomcat-users.xml:

<tomcat-users>
  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="manager-status"/>
  <role rolename="admin-gui"/>
  <role rolename="admin-script"/>

  <user username="root" password="root" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>

</tomcat-users>

~/.m2/settings.xml:

...
<server>
  <id>tomcat</id>
  <username>root</username>
  <password>root</password>
</server>
...

pom.xml:

...
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>myapp</artifactId>
  <version>1.1.0</version>
  <packaging>war</packaging>
...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>tomcat-maven-plugin</artifactId>
        <configuration>
          <!-- neglect /html below Tomcat7: -->
          <url>http://server:8080/manager/html</url>
          <!-- Refer to the server settings in your ~/.m2/settings.xml -->
          <server>tomcat</server>
          <path>/myWebApp</path>
        </configuration>
      </plugin>
      ....
    </plugins>
  </build>
...

首先启动您的 tomcat 然后构建和部署您的应用程序..

mvn clean install tomcat:deploy

..它可以在http://server:8080/myWebApp下访问

我更喜欢使用“ ## ”符号来标注 tomcat 中 *.war 文件的版本。
例如:
myapp.war -> URL: http://localhost:8080/myapp/MyServlet
myapp##1.1.0 -> URL: http://localhost:8080/myapp/MyServlet (还是一样,因为“ ## ”之后的所有符号都被tomcat忽略了)

web.xml 中没有为此设置。 我不相信有可能以跨容器的方式在war文件中设置它——无论如何在规范中都没有提到它——所以每个容器的做法都不同。 jboss-web.xmlsun-web.xmlcontext.xml等。

我遇到了同样的问题,事实上,正如@matt提到的, Tomcat 参考文档很好地解释了 Tomcat 如何自动部署应用程序,以及如何配置自定义逻辑以将上下文路径映射到应用程序文件位置。

就我而言,我使用了这个建议(在“路径”解释中):

即使在 server.xml 中静态定义 Context 时,也不得设置此属性 (/path),除非 docBase 不在主机的 appBase 下,或者deployOnStartup 和 autoDeploy 均为 false 如果不遵守此规则,很可能导致双重部署。

所以在我的情况下,我将deployOnStartupautoDeploy都切换为 false,所以我的 WAR(egaWAR)没有自动展开到 webapps 下的“a”目录,而是因为这些设置而进入“b”目录:

<Host name="localhost"  appBase="webapps"
            autoDeploy="false" deployOnStartup="false" 
            unpackWARs="true" deployIgnore="${ignore.context}">

   <Context docBase="a" path="/b" />

</Host>

我发现关于这个主题的所有建议都有些简洁和混乱。 以下方法适用于我使用默认的 tomcatee 安装。

假设我有一个名为 mywar.war 的战争文件。 这包含一个到“/hello”的 servlet 映射。 我想从像 localhost:8080/myapp/hello 这样的 url 访问这个 servlet

此方法可避免对 server.xml 进行任何更改,不建议这样做,因为这需要重新启动 tomcat。

如果您部署到 /webapps,此方法将失败,因为它将尝试部署相同的战争两次。 因此,我首先创建一个要部署到的新目录。 我使用 /apps 但目录名称是任意的。

我现在将 mywar.war 复制到应用程序中。 Tomcat 忽略此操作。 我现在创建一个名为 myapp.xml 的简单部署文件。 请注意,此文件的名称定义了将部署战争的 URL 上下文。 相信你可以使用ROOT.xml来部署下。 内容如下:

如上所述,这需要复制到 /conf/Catalina/localhost 这会导致 tomcat 扩展和部署 /apps/mywar.war 并设置正确的 URL 上下文。 servlet 现在可以在 localhost://myapp/hello (或远程客户端:8080//myapp/hello)上使用。

请注意,对于相对地址,docBase URL 从 webapps 目录中识别战争的位置 - 因此前导..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM