web-dev-qa-db-ja.com

warファイル名からwarアプリケーション名を分離する

現在、say myapp.warという名前のTomcatにwarファイルをデプロイすると、 http:// localhost/myapp/MyServlet でそのURLにアクセスできます。

ただし、私が欲しいのは、warファイル名にバージョン番号を付けてwarをデプロイし、それでも同じURLを保持することです。たとえば、myapp-1.1.0.warをデプロイし、URLを http:// localhost/myapp/MyServlet にしたい場合

もちろん、私はwarを更新し続ける必要があり、バージョン番号は変化し続けるので、どこにでもwarファイル名をハードコードすることはできません。 warファイル名に関係なく、web.xmlにアプリの同じURLを維持するために使用できる設定はありますか?

27
pdeva

解決策は、「コンテキスト名」(URLの/myapp部分)をWARファイル名の「.war」の前の部分に設定するショートカットをとるTomcatの自動デプロイメント機能の使用を停止することです。

代わりに、WARの内容を自分でファイルシステムに抽出し、目的のコンテキストパス(Tomcat_HOME/conf/[enginename]/[hostname]/[contextname].xmlなど)がディスク上のアプリケーションの場所(/myappなど)を指すXMLファイルを/opt/webapps/myapp-1.1.0/に設定します。

Tomcatリファレンスドキュメント は、Tomcatがアプリケーションを自動的にデプロイする方法、およびコンテキストパスをアプリケーションファイルの場所にマッピングするためのカスタマイズされたロジックを構成する方法の適切な説明を提供します(これを設定するいくつかの代替方法があります上記で提案したもの以外)。

14
matt b

これには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でアクセスできます

4
Lorand Bendig

Tomcatの* .warファイルのバージョンを示すために、「##」記号を使用することを好みます。
例えば:
myapp.war-> URL: http:// localhost:8080/myapp/MyServlet
myapp##1.1.0-> URL: http:// localhost:8080/myapp/MyServlet (「##」の後のすべての記号はTomcatによる無視)

1

このためのweb.xmlの設定はありません。クロスコンテナーの方法でこれをwarファイル内に設定することは可能だとは思いません-いずれにせよ、仕様にはそれが記載されていないため、コンテナーごとに異なる方法で行われます。 jboss-web.xmlSun-web.xmlcontext.xmlなど.

1

私は同じ問題に遭遇し、実際に @ matt が言及しているように、 Tomcatのリファレンスドキュメント は、Tomcatがアプリケーションを自動的にデプロイする方法、およびカスタマイズされた構成方法を説明していますコンテキストパスをアプリケーションファイルの場所にマッピングするためのロジック。

私の場合、私は(「パス」の説明で)このアドバイスを使用しました:

Server.xmlでコンテキストを静的に定義する場合でも、docBaseがホストのappBaseの下にない場合を除き、この属性(/ path)はnotに設定する必要がありますまたは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>
0
OhadR