Tomcat - Maven插件:运行webapps但不是当前项目

时间:2013-03-18 15:13:18

标签: maven web-applications tomcat7 maven-tomcat-plugin

tomcat7-maven-plugin允许将当前项目作为Web应用程序运行,并且可以指定将同时加载到tomcat中的其他<webapps>

我的项目不是Web应用程序,但它访问webapps提供的服务。那么如何在不将项目本身作为webapp运行的情况下部署大量的Web应用程序呢?以下Maven代码段导致FileNotFoundExceptions,因为找不到context.xml。

<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>

解决方法:

即使您的应用本身不是网络应用,您也需要为其配置pathcontextFile

<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>

2 个答案:

答案 0 :(得分:6)

这可能会滥用tomcat maven插件,但这是我找到的解决方案。 BTW您的虚假上下文文件解决方案对我不起作用,因为我需要运行不同的webapp,而我的应用程序也是一个webapp。

那里有一个jira可以为我们的问题提供更好的解决方案。见https://issues.apache.org/jira/browse/MTOMCAT-228。现在我的解决方案......

首先,您需要将war复制到目录。我建议目标目录,以便它可以很容易地清理。取决于你是想支持跑步还是跑步战争目标取决于你是复制战争还是复制战争并解压缩。

<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>

接下来,您需要配置tomcat插件以查看上一步中刚刚复制到的目录或war。以下显示了tomcat 6&amp;的配置。 7除了工件id之外是相同的。

<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和amp;这可能是一个很好的方法。

答案 1 :(得分:2)

我对如何以类似maven的方式解决这个问题有了另一个想法。我想在此记录,因为这可能对其他人有所帮助。我还没有测试过这个解决方案,但我认为没有理由说它不起作用。

基本上,如果你想使用jetty或tomcat插件启动一个“不同”的webapp而不是当前的webapp,你可以这样做:

在项目中创建另一个maven模块。此模块将是您要启动的webapp的空战争叠加层。然后你可以将所有的jetty或tomcat配置放在那个新模块中(或者只是将pluty和tomcat配置集中在pluginManagement下的父pom中)。从那以后,码头和tomcat旨在启动“当前”应用程序,不需要特殊的黑客配置。