1

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

但是,我有一个非常特殊的要求:我依赖于一个没有被 mavenised 的 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>

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

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

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

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

顺便说一句,我在同一阶段在两次不同的执行中这样做的原因很大程度上是因为我无法配置start-portal同时部署两个 web 应用程序(一个来自 maven 工件,另一个来自外部战争)。如果有人知道如何做到这一点,那对我来说也是一个可以接受的解决方法(尽管与这个问题的标题并不真正相关)。webapps 配置属性似乎不适用于外部战争,只是 Maven 工件。

我完全没有想法。任何人都遇到过这个问题或知道我该如何完成这个问题?

谢谢

4

1 回答 1

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 中,我指定了我的外部爆炸战争。我想这里有一个限制,因为看起来只能部署一个外部 webapp,但这对我来说已经足够了。

于 2014-05-08T08:29:50.107 回答