如何使用 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
模块列为要在<deployable>
元素中部署的模块。来自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 无效。在配置文件中,应在<profile><build><plugins><plugin>...</plugin></plugins></build></profile>
下声明插件。
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?