7

では、現在のtomcat7-maven-pluginプロジェクトを Web アプリケーションとして実行でき、<webapps>同時に tomcat にロードされる追加のプロジェクトを指定できます。

私のプロジェクトは Web アプリケーションではありませんが、Web アプリケーションによって提供されるサービスにアクセスします。では、プロジェクト自体を Web アプリケーションとして実行せずに、多数の Web アプリケーションをデプロイするにはどうすればよいでしょうか? 次の Maven スニペットでは、context.xml が見つからないため、FileNotFoundExceptions が発生します。

<plugin>
  <groupId>org.apache.tomcat.maven</groupId>
  <artifactId>tomcat7-maven-plugin</artifactId>
  <version>2.0</version>
  <executions>
    <execution>
      <id>run-tomcat</id>
      <phase>${tomcat.run.phase}</phase>
      <goals><goal>run-war-only</goal></goals>
      <configuration>
        <webapps>
          <webapp>
            <contextPath>/my/app1</contextPath>
            <groupId>...</groupId> 
            <artifactId>...</artifactId>
            <version>...</version>
            <type>war</type>    
            <asWebapp>true</asWebapp>
          </webapp>
          ... possibly more webapps ...
        </webapps> 
      </configuration>
    </execution>
    <execution>
      <id>tomcat-shutdown</id>
      <phase>${tomcat.shutdown.phase}</phase>
      <goals><goal>shutdown</goal></goals>
    </execution>
  </executions>
</plugin>

回避策:

pathアプリケーション自体は webapp ではありませんが、 aと aを構成する必要がありますcontextFile

<configuration>
    <path>/my/non/existing/webapp</path>
    <contextFile>src/test/resources/context.xml</contextFile>
    <webapps>
    ...

指定context.xmlしたファイルが存在している必要があります。web.xmlファイルが存在しない場合でも、次のことがうまくいきました。

<?xml version="1.0" encoding="utf-8"?>
<Context path="/my/non/existing/webapp">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
4

2 に答える 2

6

これはおそらく tomcat maven プラグインを悪用していますが、ここに私が見つけた解決策があります。ところで、別の Web アプリを実行する必要があり、私のアプリも Web アプリであるため、偽のコンテキスト ファイル ソリューションは機能しませんでした。

私たちの問題に対するより良い解決策を提供してくれる Jira があります。https://issues.apache.org/jira/browse/MTOMCAT-228を参照してください。今私の解決策に...

まず、戦争をディレクトリにコピーする必要があります。簡単にクリーンアップできるように、ターゲットディレクトリをお勧めします。実行または実行-戦争の目標をサポートするかどうかは、単に戦争をコピーするか、戦争をコピーして解凍するかによって異なります。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>${maven-dependency-plugin.version}</version>
  <executions>
    <execution>
      <id>copy-war</id>
      <goals>
        <goal>copy</goal>
      </goals>
      <configuration>
        <artifactItems>
          <artifactItem>
            <groupId>org.foo</groupId>
            <artifactId>bar</artifactId>
            <version>${bar.version}</version>
            <type>war</type>
            <overWrite>true</overWrite>
            <outputDirectory>${project.build.directory}/bar/</outputDirectory>
          </artifactItem>
        </artifactItems>
        <stripVersion>true</stripVersion>
      </configuration>
    </execution>
    <execution>
      <id>copy-war-unpack</id>
      <goals>
        <goal>unpack</goal>
      </goals>
      <configuration>
        <artifactItems>
          <artifactItem>
            <groupId>org.foo</groupId>
            <artifactId>bar</artifactId>
            <version>${bar.version}</version>
            <type>war</type>
            <overWrite>true</overWrite>
            <outputDirectory>${project.build.directory}/bar/bar</outputDirectory>
          </artifactItem>
        </artifactItems>
      </configuration>
    </execution>
  </executions>
</plugin>

次に、上記の手順でコピーしたディレクトリまたは war を参照するように tomcat プラグインを構成する必要があります。以下は、アーティファクト ID 以外は同じである tomcat 6 & 7 の構成を示しています。

<plugin>
  <groupId>org.apache.tomcat.maven</groupId>
  <artifactId>tomcat6-maven-plugin</artifactId>
  <version>${tomcat6-maven-plugin.version}</version>
  <configuration>
    <port>8090</port>
    <path>${default.rice.context.path}</path>
    <warDirectory>${project.build.directory}/bar/bar.war</warDirectory>
    <warSourceDirectory>${project.build.directory}/bar/bar</warSourceDirectory>
  </configuration>
</plugin>
<plugin>
  <groupId>org.apache.tomcat.maven</groupId>
  <artifactId>tomcat7-maven-plugin</artifactId>
  <version>${tomcat7-maven-plugin.version}</version>
  <configuration>
    <port>8090</port>
    <path>${default.rice.context.path}</path>
    <warDirectory>${project.build.directory}/bar/bar.war</warDirectory>
    <warSourceDirectory>${project.build.directory}/bar/bar</warSourceDirectory>
  </configuration>
</plugin>

明確にするために、tomcat:run のみをサポートする場合は、warDirectory を構成したり、copy-war を実行したりする必要はありません。逆に、tomcat:run-war のみをサポートする場合は、warSourceDirectory を構成したり、copy-war-unpack を実行したりする必要はありません。

最後に、この依存関係コピーの回避策は Jetty Maven プラグインでもうまく機能するため、Tomcat と Jetty の両方をサポートしたい場合は、これが良い方法かもしれません。

于 2013-09-11T01:35:50.933 に答える
2

この問題をMavenのような方法で解決する方法について、別のアイデアがありました。これは他の人に役立つかもしれないので、ここに記録したいと思いました。このソリューションはまだテストしていませんが、機能しない理由はわかりません。

基本的に、jetty または tomcat プラグインを使用して現在のものとは「異なる」Web アプリケーションを起動する場合は、次のようにします。

プロジェクトに別の Maven モジュールを作成します。このモジュールは、起動する webapp の空の war オーバーレイになります。次に、すべての jetty または tomcat 構成をその新しいモジュールに配置できます (または、jetty および tomcat 構成を pluginManagement の下の親 pom に集中化するだけです)。jetty と tomcat は「現在の」アプリケーションを起動するように設計されているため、特別なハッキング構成は必要ありません。

于 2013-09-12T18:47:51.653 に答える