3.4 Automated Build Highlights
Prev | 3. GreenPages Highlights | Next

## 3.4 Automated Build Highlights

Another important aspect of application development is automated build. This permits application artifacts to be created outside of the developer’s IDE. The application can then be created and tested in a variety of environments, including continuous integration servers.

### Building the PAR

All of the GreenPages projects have Maven POM files for building. The PAR is built using the file `pom.xml` in the `greenpages` folder. This file defines a parent POM and a packaging type of `par`:

    <parent>
          <groupId>org.eclipse.virgo</groupId>
          <artifactId>greenpages.parent-solution</artifactId>
          <version>2.4.0.RELEASE</version>
          <relativePath>../parent</relativePath>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <groupId>org.eclipse.virgo</groupId>
    <artifactId>greenpages-solution</artifactId>
    <name>GreenPages PAR</name>
    <description>GreenPages PAR</description>
    <packaging>par</packaging>

Thorsten Maus created a Maven plugin (see Section A.2, “Documentation”) that builds a PAR file from a list of dependencies. The file `pom.xml` lists those dependencies:

    <dependencies>
          <dependency>
                <groupId>org.eclipse.virgo</groupId>
                <artifactId>greenpages.app-solution</artifactId>
                <version>${project.version}</version>
          </dependency>
          <dependency>
                <groupId>org.eclipse.virgo</groupId>
                <artifactId>greenpages.jpa-solution</artifactId>
                <version>${project.version}</version>
          </dependency>
          <dependency>
                <groupId>org.eclipse.virgo</groupId>
                <artifactId>greenpages.db-solution</artifactId>
                <version>${project.version}</version>
          </dependency>
          <dependency>
                <groupId>org.eclipse.virgo</groupId>
                <artifactId>greenpages.web-solution</artifactId>
                <version>${project.version}</version>
                <type>war</type>
          </dependency>
          <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>com.springsource.freemarker</artifactId>
                <scope>provided</scope>
          </dependency>
    </dependencies>

The freemarker dependency is required to ensure the Web Application Bundle has the correct set of dependencies. Most dependencies are resolved transitively from the bundle projects, but the ‘war’ project does not pass on its dependencies; it expects them to be contained in its `lib` directory.

The `<build><plugins>…` section contains a declaration for the `par` plugin and configuration of the application symbolic name of the PAR:

    <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-par-plugin</artifactId>
          <version>1.0.0.RELEASE</version>
          <configuration>
                <applicationSymbolicName>greenpages</applicationSymbolicName>
          </configuration>
    </plugin>

### Obtaining Dependencies

The Maven `dependency` plugin is used to collect the transitive dependency graph for the PAR.

The `<build><plugins>…` section has a declaration for the `dependency` plugin:

    <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <executions>
                <execution>
                      <id>copy-dependencies</id>
                      <phase>package</phase>
                      <goals>
                            <goal>copy-dependencies</goal>
                      </goals>
                      <configuration>
                            <outputDirectory>${project.build.directory}/par-provided</outputDirectory>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <excludeGroupIds>org.eclipse.virgo,org.apache.log4j</excludeGroupIds>
                      </configuration>
                </execution>
          </executions>
    </plugin>

The WAB must be prevented from having its dependencies included in a `lib` directory as they should be provided by the runtime enviroment. The `greenpages.web` POM file contains the following:

    <build>
          <plugins>
                <plugin>
                      <artifactId>maven-war-plugin</artifactId>
                      <version>2.1-beta-1</version>
                      <configuration>
                            <packagingExcludes>WEB-INF/lib/**</packagingExcludes>
                      </configuration>
                </plugin>
          </plugins>
    </build>

### Automatically Running the Tests

The following plug-in entry in the `pom.xml` file in the `parent` directory ensure that the concrete test classes are run as part of the build:

    <plugin>
    	<groupId>org.apache.maven.plugins</groupId>
    	<artifactId>maven-surefire-plugin</artifactId>
    	<configuration>
    		<includes>
    			<include>**/*Tests.java</include>
    		</includes>
    		<excludes>
    			<exclude>**/Abstract*.java</exclude>
    		</excludes>
    		<junitArtifactName>org.junit:com.springsource.org.junit</junitArtifactName>
    		<argLine>-javaagent:${user.home}/.m2/repository/…</argLine>
    	</configuration>
    </plugin>

The location of the user's Maven repository is hard-coded.

Prev | Up | Next
3.3 Testing Highlights | Home | Appendix A. Further Resources