7

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

我的项目不是 Web 应用程序,但它访问 webapps 提供的服务。那么如何在不将项目本身作为 webapp 运行的情况下部署多个 webapps 呢?以下 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>

解决方法:

即使您的应用程序本身不是 webapp,您也需要为其配置 apath和 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。现在开始我的解决方案......

首先,您需要将战争复制到一个目录。我建议使用目标目录,以便轻松清理它。取决于您是要支持 run 还是 run-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 和 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 或执行复制战。反之,如果只想支持tomcat:run-war,则不需要配置warSourceDirectory,也不需要执行copy-war-unpack。

最后一点,这个依赖副本解决方法也适用于 Jetty Maven 插件,所以如果你想同时支持 tomcat 和 jetty,这可能是一个很好的方法。

于 2013-09-11T01:35:50.933 回答
2

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

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

在您的项目中创建另一个 Maven 模块。此模块将是您要启动的 web 应用程序的空战争覆盖。然后你可以把你所有的 jetty 或 tomcat 配置放在那个新模块中(或者只是将 jetty 和 tomcat 配置集中在 pluginManagement 下的父 pom 中)。由于 jetty 和 tomcat 旨在启动“当前”应用程序,因此不需要特殊的破解配置。

于 2013-09-12T18:47:51.653 回答