Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

This tutorial demonstrates how to use the Cargo Maven 2 / Cargo Maven 3 plugin to automatically start/stop a container (possibly deploying some deployables to it as it starts).

Info
titleLike to learn by example? Take a look at our archetypes

We have several Maven 2 / Maven 3 Archetypes that contain sample Maven 2 / sample Maven 3 projects with different use cases for the Codehaus Cargo Maven 2 / Maven 3 plugin, we would really recommend that you check them out. For more details, read here: Maven 3 Archetypes.

...

Code Block
xml
xml
[...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.cargo</groupId>
        <artifactId>cargo-maven2maven3-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
[...]

...

This minimal configuration allows you to configure a default Tomcat 5.x standalone configuration (when the configuration type is not defined as above, the plugin will use a standalone configuration by default) in ${project.basedir}/target/resin.

Example of a full-fledged Maven 2 / fledged Maven 3 configuration:

Code Block
xml
xml
[...]
<configuration>

  <!-- Container configuration -->
  <container>
    <containerId>tomcat7x</containerId>
    <zipUrlInstaller>
      <url>https://repo.maven.org/maven2/org/apache/tomcat/tomcat/7.0.68/tomcat-7.0.68.zip</url>
    </zipUrlInstaller>
    <!--
      Instead of downloading the container, you can also reuse an
      existing installation by settings its directory:

      <home>C:/Program Files/Apache/Apache Tomcat 7.0.68</home>
      -->
    <output>${project.build.directory}/tomcat7x/container.log</output>
    <append>false</append>
    <log>${project.build.directory}/tomcat7x/cargo.log</log>
  </container>

  <!-- Configuration to use with the container or the deployer -->
  <configuration>
    <type>standalone</type>
    <home>${project.build.directory}/tomcat7x</home>
    <properties>
      <cargo.servlet.port>8080</cargo.servlet.port>
      <cargo.logging>high</cargo.logging>
    </properties>
  </configuration>
  <deployables>
    <deployable>
      <groupId>war group id</groupId>
      <artifactId>war artifact id</artifactId>
      <type>war</type>
      <properties>
        <context>optional root context</context>
      </properties>
    </deployable>
    <deployable>
      <groupId>ear group id</groupId>
      <artifactId>ear artifact id</artifactId>
      <type>ear</type>
    </deployable>
    [...]
  </deployables>
 </configuration>
[...]

...

Tip
titleTimeouts

The CARGO container definiton as well as the various application ping options in CARGO have a timeout option (which is extremely useful in real-life applications), the default timeout being set to 2 minutes in most cases. Please check the Maven 2 / Maven 3 Plugin Reference Guide as well as the documentation about Container Timeout for details.

...

Code Block
xml
xml
[...]
<plugin>
 <groupId>org.codehaus.cargo</groupId>
 <artifactId>cargo-maven2maven3-plugin</artifactId>
 <configuration>
   <container>
     <containerId>jetty6x</containerId>
     <type>embedded</type>
   </container>
 </configuration>
</plugin>
[...]

...

Code Block
xml
xml
[...]
<plugin>
 <groupId>org.codehaus.cargo</groupId>
 <artifactId>cargo-maven2maven3-plugin</artifactId>
 <configuration>
   [...]
   <properties>
     <cargo.java.home>/usr/package/j2dsk1.4.2_11</cargo.java.home>
   </properties>
   [...]
 </configuration>
</plugin>
[...]

...

Code Block
xml
xml
<plugin>
  <groupId>org.codehaus.cargo</groupId>
  <artifactId>cargo-maven2maven3-plugin</artifactId>
  <configuration>
    [...]
    <deployables>
      <deployable>
        <location>${project.build.directory}/${project.build.finalName}.${project.packaging}</location>
        <pingURL>http://localhost:port/mycontext/index.html</pingURL>
      </deployable>
    </deployables>
    [...]

...

Code Block
xml
xml
<plugin>
  <groupId>org.codehaus.cargo</groupId>
  <artifactId>cargo-maven2maven3-plugin</artifactId>
  <executions>
    <execution>
      <id>start-container</id>
      <phase>pre-integration-test</phase>
      <goals>
        <goal>start</goal>
      </goals>
    </execution>
    <execution>
      <id>stop-container</id>
      <phase>post-integration-test</phase>
      <goals>
        <goal>stop</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    [Cargo plugin configuration goes in here]
  </configuration>
</plugin>

...

Code Block
xml
xml
[...]
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring</artifactId>
    <version>2.0</version>
  </dependency>
</dependencies>
[...]
<plugin>
  <groupId>org.codehaus.cargo</groupId>
  <artifactId>cargo-maven2maven3-plugin</artifactId>
  <configuration>
    <container>
      [...]
      <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring</artifactId>
        </dependency>
      </dependencies>
    </container>
    [...]
  </configuration>
</plugin>

...

Code Block
xml
xml
[...]
<plugin>
  <groupId>org.codehaus.cargo</groupId>
  <artifactId>cargo-maven2maven3-plugin</artifactId>
  <configuration>
    [...]
    <properties>
      <cargo.datasource.datasource.derby>
        cargo.datasource.driver=org.apache.derby.jdbc.EmbeddedDriver|
        cargo.datasource.url=jdbc:derby:derbyDB;create=true|
        cargo.datasource.jndi=jdbc/CargoDS|
        cargo.datasource.username=APP|
        cargo.datasource.password=nonemptypassword
      </cargo.datasource.datasource.derby>
    </properties>
    [...]
    <container>
      [...]
      <dependencies>
        <dependency>
          <groupId>org.apache.derby</groupId>
          <artifactId>derby</artifactId>
        </dependency>
      </dependencies>
    </container>
  </configuration>
</plugin>

...

Code Block
xml
xml
[...]
<plugin>
  <groupId>org.codehaus.cargo</groupId>
  <artifactId>cargo-maven2maven3-plugin</artifactId>
  <configuration>
    [...]
    <properties>
      <cargo.datasource.datasource.derby>
        cargo.datasource.driver=org.apache.derby.jdbc.EmbeddedDriver|
        cargo.datasource.url=jdbc:derby:derbyDB;create=true|
        cargo.datasource.jndi=jdbc/CargoDS|
        cargo.datasource.username=foo|
        cargo.datasource.password=foopassword
      </cargo.datasource.datasource.derby>
      <cargo.datasource.datasource.derby2>
        cargo.datasource.driver=org.apache.derby.jdbc.EmbeddedDriver|
        cargo.datasource.url=jdbc:derby:derbyDB2;create=true|
        cargo.datasource.jndi=jdbc/CargoDS2|
        cargo.datasource.username=bar|
        cargo.datasource.password=barpassword
      </cargo.datasource.datasource.derby2>
    </properties>
    [...]
  </configuration>
</plugin>

...

  • Note that if you specify this on a container that does not support transactions, you will get a CargoException during the configuration phase.
  • valid values are LOCAL_TRANSACTION or XA_TRANSACTION. Note that XA_TRANSACTION is emulated in this case.

    Code Block
    xml
    xml
    [...]
    <plugin>
      <groupId>org.codehaus.cargo</groupId>
      <artifactId>cargo-maven2maven3-plugin</artifactId>
      <configuration>
        [...]
        <properties>
          <cargo.datasource.datasource.derbytx>
            cargo.datasource.driver=org.apache.derby.jdbc.EmbeddedDriver|
            cargo.datasource.url=jdbc:derby:derbyDB;create=true|
            cargo.datasource.jndi=jdbc/CargoDS|
            cargo.datasource.username=foo|
            cargo.datasource.password=foopassword|
            cargo.datasource.transactionsupport=LOCAL_TRANSACTION
          </cargo.datasource.datasource.derbytx>
        </properties>
        [...]
      </configuration>
    </plugin>
    


...

  • Note that if you specify this on a container that does not support XADataSource configuration, you will get a CargoException during the configuration phase.

    Code Block
    xml
    xml
    [...]
    <plugin>
      <groupId>org.codehaus.cargo</groupId>
      <artifactId>cargo-maven2maven3-plugin</artifactId>
      <configuration>
        [...]
        <properties>
          <cargo.datasource.datasource.derbytx>
            cargo.datasource.type=javax.sql.XADataSource|
            cargo.datasource.driver=org.apache.derby.jdbc.EmbeddedXADataSource|
            cargo.datasource.jndi=jdbc/CargoDS|
            cargo.datasource.username=foo|
            cargo.datasource.password=foopassword|
            cargo.datasource.properties=createDatabase=create;databaseName=derbyDB
          </cargo.datasource.datasource.derbytx>
        </properties>
        [...]
      </configuration>
    </plugin>
    


...

Code Block
xml
xml
[...]
<plugin>
  <groupId>org.codehaus.cargo</groupId>
  <artifactId>cargo-maven2maven3-plugin</artifactId>
  <configuration>
    [...]
    <properties>
      <cargo.resource.resource.mail>
        cargo.resource.name=mail/Session|
        cargo.resource.type=javax.mail.Session|
        cargo.resource.parameters=mail.smtp.host=localhost;mail.smtp.connectiontimeout=10000
      </cargo.resource.resource.mail>
    </properties>
    [...]
    <container>
      [...]
      <dependencies>
        <dependency>
          <groupId>javax.activation</groupId>
          <artifactId>activation</artifactId>
        </dependency>
        <dependency>
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
        </dependency>
      </dependencies>
    </container>
  </configuration>
</plugin>
...
<dependencies>
  <dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1</version>
  </dependency>
  <dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4</version>
  </dependency>
</dependencies>

...

Code Block
xml
xml
[...]
<plugin>
  <groupId>org.codehaus.cargo</groupId>
  <artifactId>cargo-maven2maven3-plugin</artifactId>
  <configuration>
    [...]
    <properties>
      <cargo.resource.resource.nativederby>
        cargo.resource.name=resource/nativeCPDataSource|
        cargo.resource.type=javax.sql.ConnectionPoolDataSource|
        cargo.resource.class=org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource|
        cargo.resource.parameters=createDatabase=create;databaseName=derbyDB;user=APP;password=nonemptypassword
      </cargo.resource.resource.nativederby>
    </properties>
    [...]
    <container>
      [...]
      <dependencies>
        <dependency>
          <groupId>org.apache.derby</groupId>
          <artifactId>derby</artifactId>
        </dependency>
      </dependencies>
    </container>
  </configuration>
</plugin>

...

Code Block
xml
xml
[...]
<plugin>
  <groupId>org.codehaus.cargo</groupId>
  <artifactId>cargo-maven2maven3-plugin</artifactId>
  <configuration>
    [...]
    <properties>
      <cargo.resource.resource.apple>
        cargo.resource.name=resource/apple|
        cargo.resource.type=my.app.Fruit|
        cargo.resource.class=my.app.AppleImpl|
        cargo.resource.parameters=color=red;texture=crunchy
      </cargo.resource.resource.apple>
      <cargo.resource.resource.orange>
        cargo.resource.name=resource/orange|
        cargo.resource.type=my.app.Fruit|
        cargo.resource.class=my.app.OrangeImpl|
        cargo.resource.parameters=color=orange;texture=rindy
      </cargo.resource.resource.orange>
    </properties>
    [...]
  </configuration>
</plugin>

...