在预集成测试阶段使用maven-tomcat7-plugin部署到嵌入式tomcat时出现403错误

时间:2014-04-28 11:44:07

标签: maven tomcat deployment embedded-tomcat-7

我想在预集成测试阶段将我的应用程序部署到嵌入式tomcat。

但是,我有一个非常特殊的要求:我依赖于一个没有成熟的webapp。努力使它变得更加可靠,所以我认为一个好的解决方案是为我的依赖部署战争然后部署我的应用程序战争。

我的插件配置如下所示:

    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <path>/spr</path>
            <url>http://localhost:8080/manager/text</url>
            <server>localServer</server>
            <additionalConfigFilesDir>${additionalFilePath}</additionalConfigFilesDir>
            <tomcatUsers>${somePath}/tomcat-users.xml</tomcatUsers>
            <fork>true</fork>
        </configuration>
        <executions>
            <execution>
                <id>start-portal</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>run-war</goal>
                </goals>
                <configuration>
                    <path>/</path>
                    <warDirectory>${my.dependency.war.path}</warDirectory>
                </configuration>
            </execution>
            <execution>
                <id>deploy-spr</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>deploy</goal>
                </goals>
                <configuration>
                    <path>/spr</path>
                </configuration>
            </execution>
            <execution>
                <id>stop-tomcat</id>
                <phase>post-integration-test</phase>
                <goals>
                    <goal>shutdown</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

我的start-portal执行成功启动了服务器,并且正确部署了依赖项。

问题在于执行deploy-spr。我一直收到错误:

[ERROR] Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy-only (deploy-spr) on project spr: Tomcat return http status error: 403, Reason Phrase: Forbidden: <html><head><title>Apache Tomcat/7.0.47 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 403 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>Access to the specified resource has been forbidden.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.47</h3></body></html> -> [Help 1]

为完整起见,我的settings.xml包含:

<server>
  <id>localServer</id>
  <username>tomcatScript</username>
  <password>password</password>
</server>

我的pom文件引用的tomcat-users.xml包含:

<tomcat-users>

    <!-- Role to manage WAR files via HTML /manager. The name should be as is! -->
    <role rolename="manager-gui"/>
    <!-- Role to manage WAR files via script like Maven. The name should be as is! -->
    <role rolename="manager-script"/>

    <!-- One user cannot have manager-gui and manager-script roles -->
    <user username="tomcat" password="password" roles="manager-gui"/>
    <user username="tomcatScript" password="password" roles="manager-script"/>

</tomcat-users>

我发现了几个类似的错误,例如here所描述的错误。但是,它并不完全相同,因为所有这些帖子都认为服务器已在运行。

我做了一个测试,尝试将应用程序部署到已经运行的tomcat,它可以运行。问题实际上是maven启动嵌入式tomcat并部署到嵌入式tomcat。

现在,我认为问题可能是:

  • pom.xml中指定的tomcat-users.xml由于某种原因未正确读取。
  • maven在预集成测试阶段有两次执行处理不好(尽管我已经在封装阶段强制启动服务器但它仍然无法正常工作)。

顺便说一句,我之所以在同一阶段的两个不同的执行中这样做,实际上是因为我无法配置start-portal一次部署两个webapps(一个来自一个maven神器和另一个来自外部战争)。如果有人知道如何做到这一点,那对我来说也是一个可以接受的解决方案(虽然与这个问题的标题没有真正关系)。 webapps配置属性似乎不适用于外部战争,只是maven工件。

我完全没有想法。任何人遇到过这个问题或者有些想法我怎么能做到这一点?

由于

1 个答案:

答案 0 :(得分:1)

我设法解决了这个问题,实际上非常简单。

由于没有人回答,这就是我的所作所为。我现在只有一个执行来部署这两个应用程序。

<execution>
 <id>start-portal</id>
     <goal>run-war</goal>
 </goals>
 <configuration>
     <path>/</path>
     <fork>true</fork>
     <warDirectory>${portal.war}</warDirectory>
     <additionalConfigFilesDir>${portal.properties}</additionalConfigFilesDir>
     <webapps>
         <webapp>
             <contextPath>/spr</contextPath>
         </webapp>
     </webapps>
 </configuration>
</execution>

在webapps部分,我指定了我想要从maven工件部署的所有应用程序(在我的情况下,我只有一个,而且它是这个pom所属的那个,所以我可以省略它)。

在warDirectory中我指定了我的外部爆炸战争。我想这里有一个限制,因为它看起来只能部署一个外部网络应用程序,但这对我来说足够了。