如何使用 cargo 部署特定的子项目:开始使用 maven

Posted

技术标签:

【中文标题】如何使用 cargo 部署特定的子项目:开始使用 maven【英文标题】:How to deploy a specific child project with cargo:start using maven 【发布时间】:2011-03-11 21:17:11 【问题描述】:

我有一个已开发的应用程序,我只是想让构建过程变得简单。 parent 的 POM 文件如下所示:

<parent>
    <groupId>com.shc.obu.ca</groupId>
    <artifactId>shcobuca-pom</artifactId>
    <version>1.1.0</version>   </parent>

  <groupId>com.shc.obu.ca.osol</groupId> <artifactId>apps-pom</artifactId>   <version>$currVersion</version>   <packaging>pom</packaging>   <name>Outlet Apps</name>

  <scm>
    <connection>scm:svn:https://ushofsvpsvn2.intra.searshc.com/svn/outlet/outlet/trunk/apps</connection>
    <developerConnection>scm:svn:https://ushofsvpsvn2.intra.searshc.com/svn/outlet/outlet/trunk/apps</developerConnection> </scm>
    <profiles>
    <profile> <id>www</id>
      <activation> <activeByDefault>true</activeByDefault> </activation>
      <modules>
        <module>www</module>
        <module>modules</module> 
      </modules>
    </profile>
    <profile> 
      <id>mts</id>
      <activation> <activeByDefault>true</activeByDefault> </activation>
      <modules>
        <module>mts</module> 
        <module>modules</module> 
      </modules>
    </profile>
    <profile> <id>search</id>
      <activation> <activeByDefault>true</activeByDefault> </activation>
      <modules>
        <module>modules</module> 
        <module>search</module> 
      </modules>
    </profile>   </profiles>

  <repositories>
    <repository>
      <id>obu.ca.repo.release</id>
      <snapshots><enabled>false</enabled></snapshots>
      <url>http://maven.cal.intra.sears.com/release</url>
    </repository>
    <repository>
      <id>obu.ca.repo.snapshot</id>
      <releases><enabled>false</enabled></releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>interval:5</updatePolicy>
      </snapshots>
      <url>http://maven.cal.intra.sears.com/snapshot</url>
    </repository>   </repositories>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <env>trunk</env>
    <currVersion>1.2.0</currVersion>   </properties>   </project>

这个文件显示它有三个配置文件,它们基本上是独立的子项目。我正在将货物插件添加到此文件中,如下所示:

<build>
  <plugins>
      <plugin>
        <groupId>org.codehaus.cargo</groupId>
        <artifactId>cargo-maven2-plugin</artifactId>
        <version>1.0</version>
        <configuration>
          <container>
              <containerId>tomcat6x</containerId>
              <home>
                  C:\tools\apache-tomcat-6.0.26
              </home>
          </container>
          <configuration>
              <properties>
                  <cargo.servlet.port>
                      8082
                  </cargo.servlet.port>
                  <cargo.jvmargs>
                      "-Xdebug" "-Xrunjdwp:transport=dt_socket,address=4646,server=y,suspend=n"
                  </cargo.jvmargs>
              </properties>
          </configuration>     
        </configuration>  
      </plugin>
  </plugins>
  </build>

但是当我运行“mvn cargo:start”时,tomcat 实例运行良好,但没有部署任何子应用程序。有没有办法让我的第一个子应用程序 (www)(生成一个名为 www-webapp-1.2.0.war 的 war 文件)自动部署?

更新:感谢帕斯卡。我尝试修改构建标签如下:

<build>
  <plugins>
      <plugin>
        <groupId>org.codehaus.cargo</groupId>
        <artifactId>cargo-maven2-plugin</artifactId>
        <version>1.0</version>
        <configuration>
          <container>
              <containerId>tomcat6x</containerId>
              <home>
                  C:\tools\apache-tomcat-6.0.26
              </home>
          </container>
          <configuration>
              <properties>
                  <cargo.servlet.port>
                      8082
                  </cargo.servlet.port>
                  <cargo.jvmargs>
                      "-Xdebug" "-Xrunjdwp:transport=dt_socket,address=4646,server=y,suspend=n"
                  </cargo.jvmargs>
              </properties>              
              <deployables> 
                <deployable> 
                  <groupId>com.shc.obu.ca.osol</groupId> 
                  <artifactId>www-webapp-1.2.0</artifactId> 
                  <type>war</type> 
                  <properties> 
                    <context>acontext</context> 
                  </properties> 
                </deployable> 
              </deployables>               
          </configuration>    
        </configuration>  
      </plugin>
  </plugins>
  </build>

但它仍然无法正常工作。它给出如下构建错误:

Artifact [com.shc.obu.ca.osol:www-webapp-1.2.0:war] 不是项目的依赖项。 我也尝试将“www-webapp”和“www”作为工件 ID,但错误仍然相同。

当我将其添加到依赖标签时,它会给出某种循环引用错误,如下所示: '反应堆中的项目包含循环引用'

【问题讨论】:

【参考方案1】:

您需要将您的www 模块列为要在&lt;deployable&gt; 元素中部署的模块。来自Maven2 Plugin Reference Guide:

如果未指定可部署且项目的打包为 war、ear 或 ejb,并且未指定部署者,则生成的工件将自动添加到要部署的可部署列表中

由于您的项目具有 pom 类型的 packaing,因此它不是部署的候选对象,因此不会部署任何内容。

这是一个例子:

  <plugin>
    <groupId>org.codehaus.cargo</groupId>
    <artifactId>cargo-maven2-plugin</artifactId>
    <version>1.0</version>
    <configuration>
      <container>
        <containerId>tomcat6x</containerId>
        <home>C:\tools\apache-tomcat-6.0.26</home>
      </container>
      <configuration>
        <properties>
          <cargo.servlet.port>8082</cargo.servlet.port>
          <cargo.jvmargs>
              "-Xdebug" "-Xrunjdwp:transport=dt_socket,address=4646,server=y,suspend=n"
          </cargo.jvmargs>
        </properties>
        <deployables>
          <!-- application to deploy -->
          <deployable>
            <groupId>com.acme</groupId>
            <artifactId>mywebapp</artifactId>
            <type>war</type>
            <properties>
              <context>acontext</context>
            </properties>
          </deployable>
        </deployables>
      </configuration>     
    </configuration>  
  </plugin>

更新:

(...) 它给出如下构建错误

Artifact [com.shc.obu.ca.osol:www-webapp-1.2.0:war] 不是项目的依赖项。我也尝试将“www-webapp”和“www”作为工件 ID,但错误仍然相同。

我忘记了,但 Cargo 似乎希望 deployable 成为 Cargo 启动项目的依赖项。

当我将其添加到依赖标签时,它会给出某种循环引用错误,如下所示:'反应器中的项目包含循环引用'

这是正常的。工件不能是给定项目的子模块和依赖项,或者您会获得循环依赖项(您需要一个依赖项来构建一个模块,即依赖项、鸡和蛋的问题)。

我的建议是将货物配置移动到www 模块或为您的功能测试创建一个专用模块(这通常是我所做的)并将www 声明为该模块的依赖项。

【讨论】:

嗨,Pascal,您能否帮我提供一个示例,用于您建议使用上面提供的 POM 代码的两种方法。我尝试了第一种方法,然后遇到了一些错误,例如配置文件无法识别插件标签等,并且不确定如何实现第二种方法。谢谢,Neeraj @Neeraj:这表明 POM 无效。在配置文件中,应在 &lt;profile&gt;&lt;build&gt;&lt;plugins&gt;&lt;plugin&gt;...&lt;/plugin&gt;&lt;/plugins&gt;&lt;/build&gt;&lt;/profile&gt; 下声明插件。 POM 是有效的,我能够在 www 配置文件中移动整个构建标签,但结果是相同的。我尝试了“mvn cargo:start”和“mvn -Pwww cargo:start”,但我的应用程序 www-webapp-1.2.0.war 仍然没有部署或启动。但是,如果我尝试运行命令“mvn -Pwww cargo:deploy”(在配置文件外部或内部使用构建标签),我的“www”war 文件(www-webapp-1.2.0.war)确实会复制到 webapps 文件夹下货物。 但是我现在可以做的一件事是从不同的窗口运行'mvn cargo:start'并从另一个窗口运行'mvn cargo:deploy',这使它现在可以工作。谢谢【参考方案2】:

这里是如何使用 Cargo 进行多模块部署的示例。它有一个父模块和三个模块,其中一个模块负责部署所有三个模块。您可以从第三个模块运行 mvn cargo:run 以部署所有这些模块。

==================== PARENT 1 =========================

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.blah.test</groupId>
    <artifactId>blah-service</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>blah-service-module1</module>
        <module>blah-service-module2</module>
        <module>blah-service-module3</module>
    </modules>
</project>

==================== MODULE 1 =========================

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.blah.test</groupId>
        <artifactId>blah-service</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>blah-service-module1</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
</project>

==================== MODULE 2 =========================

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.blah.test</groupId>
        <artifactId>blah-service</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>blah-service-module2</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
</project>

========== MODULE 3: the one which deploys all three with cargo =========================

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.blah.test</groupId>
        <artifactId>blah-service</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>blah-service-module3</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.blah.test</groupId>
            <artifactId>blah-service-module1</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>war</type>
        </dependency>
        <dependency>
            <groupId>com.blah.test</groupId>
            <artifactId>blah-service-module2</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>war</type>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <version>1.4.6</version>
                <configuration>
                    <container>
                        <containerId>jetty6x</containerId>
                        <type>embedded</type>
                    </container>
                    <deployables>
                        <deployable>
                            <groupId>com.blah.test</groupId>
                            <artifactId>blah-service-module1</artifactId>
                            <type>war</type>
                            <properties>
                                <context>api/blah/module1</context>
                            </properties>
                        </deployable>
                        <deployable>
                            <groupId>com.blah.test</groupId>
                            <artifactId>blah-service-module2</artifactId>
                            <type>war</type>
                            <properties>
                                <context>api/blah/module2</context>
                            </properties>
                        </deployable>
                        <deployable>
                            <groupId>com.blah.test</groupId>
                            <artifactId>blah-service-module3</artifactId>
                            <type>war</type>
                            <properties>
                                <context>api/blah/module3</context>
                            </properties>
                        </deployable>
                    </deployables>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

【讨论】:

以上是关于如何使用 cargo 部署特定的子项目:开始使用 maven的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Cargo 执行构建脚本并同时使用特定于目标的链接器?

如何使用 Cargo maven 插件远程部署 EAR 到 JBoss 5.1.0.GA?

使用 cargo 插件在 payara 上部署

Maven2:Cargo 插件热部署 & Jonas 支持

无法使用 cargo-maven-plugin 重新部署到远程 tomcat 7

Rust 中项目构建管理工具 Cargo简单介绍