blob: 374f6007ba19fb8d4fd49d3449d18d0d7c16050e [file] [log] [blame]
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>3.4&nbsp;Automated Build Highlights</title><link rel="stylesheet" href="css/stylesheet.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.74.0"><link rel="home" href="index.html" title="A Guide to the GreenPages Sample"><link rel="up" href="ch03.html" title="3.&nbsp;GreenPages Highlights"><link rel="prev" href="ch03s03.html" title="3.3&nbsp;Testing Highlights"><link rel="next" href="apa.html" title="Appendix&nbsp;A.&nbsp;Further Resources"><!--Begin Google Analytics code--><script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
var pageTracker = _gat._getTracker("UA-2728886-3");
pageTracker._setDomainName("none");
pageTracker._setAllowLinker(true);
pageTracker._trackPageview();
</script><!--End Google Analytics code--></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.4&nbsp;Automated Build Highlights</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s03.html">Prev</a>&nbsp;</td><th width="60%" align="center">3.&nbsp;GreenPages Highlights</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="apa.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="highlights.automated.build"></a>3.4&nbsp;Automated Build Highlights</h2></div></div></div><p>
Another important aspect of application development is automated build. This permits
application artifacts to be created outside of the developer&#8217;s IDE. The application can then be
created and tested in a variety of environments, including continuous integration servers.
</p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1228"></a>Building the PAR</h3></div></div></div><p>
All of the GreenPages projects have Maven POM files for building.
The PAR is built using the file <code class="filename">pom.xml</code> in the <code class="literal">greenpages</code> folder.
This file defines a parent POM and a packaging type of <code class="literal">par</code>:
</p><pre class="programlisting">&lt;<span class="hl-tag">parent</span>&gt;
&lt;<span class="hl-tag">groupId</span>&gt;org.eclipse.virgo&lt;<span class="hl-tag">/groupId</span>&gt;
&lt;<span class="hl-tag">artifactId</span>&gt;greenpages.parent&lt;<span class="hl-tag">/artifactId</span>&gt;
&lt;<span class="hl-tag">version</span>&gt;2.4.0.RELEASE&lt;<span class="hl-tag">/version</span>&gt;
&lt;<span class="hl-tag">relativePath</span>&gt;../greenpages.parent&lt;<span class="hl-tag">/relativePath</span>&gt;
&lt;<span class="hl-tag">/parent</span>&gt;
&lt;<span class="hl-tag">modelVersion</span>&gt;4.0.0&lt;<span class="hl-tag">/modelVersion</span>&gt;
&lt;<span class="hl-tag">groupId</span>&gt;org.eclipse.virgo&lt;<span class="hl-tag">/groupId</span>&gt;
&lt;<span class="hl-tag">artifactId</span>&gt;greenpages&lt;<span class="hl-tag">/artifactId</span>&gt;
&lt;<span class="hl-tag">name</span>&gt;GreenPages PAR&lt;<span class="hl-tag">/name</span>&gt;
&lt;<span class="hl-tag">description</span>&gt;GreenPages PAR&lt;<span class="hl-tag">/description</span>&gt;
&lt;<span class="hl-tag">packaging</span>&gt;par&lt;<span class="hl-tag">/packaging</span>&gt;
</pre><p>
</p><p>
Thorsten Maus created a Maven plugin (see <a class="xref" href="apas02.html" title="A.2&nbsp;Documentation">Section&nbsp;A.2, &#8220;Documentation&#8221;</a>)
that builds a PAR file from a list of dependencies.
The file <code class="filename">pom.xml</code> lists those dependencies:
</p><pre class="programlisting">&lt;<span class="hl-tag">dependencies</span>&gt;
&lt;<span class="hl-tag">dependency</span>&gt;
&lt;<span class="hl-tag">groupId</span>&gt;org.eclipse.virgo&lt;<span class="hl-tag">/groupId</span>&gt;
&lt;<span class="hl-tag">artifactId</span>&gt;greenpages.app&lt;<span class="hl-tag">/artifactId</span>&gt;
&lt;<span class="hl-tag">version</span>&gt;${project.version}&lt;<span class="hl-tag">/version</span>&gt;
&lt;<span class="hl-tag">/dependency</span>&gt;
&lt;<span class="hl-tag">dependency</span>&gt;
&lt;<span class="hl-tag">groupId</span>&gt;org.eclipse.virgo&lt;<span class="hl-tag">/groupId</span>&gt;
&lt;<span class="hl-tag">artifactId</span>&gt;greenpages.jpa&lt;<span class="hl-tag">/artifactId</span>&gt;
&lt;<span class="hl-tag">version</span>&gt;${project.version}&lt;<span class="hl-tag">/version</span>&gt;
&lt;<span class="hl-tag">/dependency</span>&gt;
&lt;<span class="hl-tag">dependency</span>&gt;
&lt;<span class="hl-tag">groupId</span>&gt;org.eclipse.virgo&lt;<span class="hl-tag">/groupId</span>&gt;
&lt;<span class="hl-tag">artifactId</span>&gt;greenpages.db&lt;<span class="hl-tag">/artifactId</span>&gt;
&lt;<span class="hl-tag">version</span>&gt;${project.version}&lt;<span class="hl-tag">/version</span>&gt;
&lt;<span class="hl-tag">/dependency</span>&gt;
&lt;<span class="hl-tag">dependency</span>&gt;
&lt;<span class="hl-tag">groupId</span>&gt;org.eclipse.virgo&lt;<span class="hl-tag">/groupId</span>&gt;
&lt;<span class="hl-tag">artifactId</span>&gt;greenpages.web&lt;<span class="hl-tag">/artifactId</span>&gt;
&lt;<span class="hl-tag">version</span>&gt;${project.version}&lt;<span class="hl-tag">/version</span>&gt;
&lt;<span class="hl-tag">type</span>&gt;war&lt;<span class="hl-tag">/type</span>&gt;
&lt;<span class="hl-tag">/dependency</span>&gt;
&lt;<span class="hl-tag">dependency</span>&gt;
&lt;<span class="hl-tag">groupId</span>&gt;org.freemarker&lt;<span class="hl-tag">/groupId</span>&gt;
&lt;<span class="hl-tag">artifactId</span>&gt;com.springsource.freemarker&lt;<span class="hl-tag">/artifactId</span>&gt;
&lt;<span class="hl-tag">scope</span>&gt;provided&lt;<span class="hl-tag">/scope</span>&gt;
&lt;<span class="hl-tag">/dependency</span>&gt;
&lt;<span class="hl-tag">/dependencies</span>&gt;
</pre><p>
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 &#8216;war&#8217; project does not pass on its dependencies;
it expects
them to be contained in its <code class="literal">lib</code> directory.
</p><p>
The <code class="literal">&lt;build&gt;&lt;plugins&gt;&#8230;</code> section contains a declaration for the
<code class="literal">par</code> plugin and configuration of the application symbolic name of the PAR:
</p><pre class="programlisting">&lt;<span class="hl-tag">plugin</span>&gt;
&lt;<span class="hl-tag">groupId</span>&gt;org.apache.maven.plugins&lt;<span class="hl-tag">/groupId</span>&gt;
&lt;<span class="hl-tag">artifactId</span>&gt;maven-par-plugin&lt;<span class="hl-tag">/artifactId</span>&gt;
&lt;<span class="hl-tag">version</span>&gt;1.0.0.RELEASE&lt;<span class="hl-tag">/version</span>&gt;
&lt;<span class="hl-tag">configuration</span>&gt;
&lt;<span class="hl-tag">applicationSymbolicName</span>&gt;greenpages&lt;<span class="hl-tag">/applicationSymbolicName</span>&gt;
&lt;<span class="hl-tag">/configuration</span>&gt;
&lt;<span class="hl-tag">/plugin</span>&gt;
</pre><p>
</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1269"></a>Obtaining Dependencies</h3></div></div></div><p>
The Maven <code class="literal">dependency</code> plugin is used to collect the transitive dependency graph for the PAR.
</p><p>
The <code class="literal">&lt;build&gt;&lt;plugins&gt;&#8230;</code> section
has a declaration for the <code class="literal">dependency</code> plugin:
</p><pre class="programlisting">&lt;<span class="hl-tag">plugin</span>&gt;
&lt;<span class="hl-tag">groupId</span>&gt;org.apache.maven.plugins&lt;<span class="hl-tag">/groupId</span>&gt;
&lt;<span class="hl-tag">artifactId</span>&gt;maven-dependency-plugin&lt;<span class="hl-tag">/artifactId</span>&gt;
&lt;<span class="hl-tag">executions</span>&gt;
&lt;<span class="hl-tag">execution</span>&gt;
&lt;<span class="hl-tag">id</span>&gt;copy-dependencies&lt;<span class="hl-tag">/id</span>&gt;
&lt;<span class="hl-tag">phase</span>&gt;package&lt;<span class="hl-tag">/phase</span>&gt;
&lt;<span class="hl-tag">goals</span>&gt;
&lt;<span class="hl-tag">goal</span>&gt;copy-dependencies&lt;<span class="hl-tag">/goal</span>&gt;
&lt;<span class="hl-tag">/goals</span>&gt;
&lt;<span class="hl-tag">configuration</span>&gt;
&lt;<span class="hl-tag">outputDirectory</span>&gt;${project.build.directory}/par-provided&lt;<span class="hl-tag">/outputDirectory</span>&gt;
&lt;<span class="hl-tag">overWriteIfNewer</span>&gt;true&lt;<span class="hl-tag">/overWriteIfNewer</span>&gt;
&lt;<span class="hl-tag">excludeGroupIds</span>&gt;org.eclipse.virgo,org.apache.log4j&lt;<span class="hl-tag">/excludeGroupIds</span>&gt;
&lt;<span class="hl-tag">/configuration</span>&gt;
&lt;<span class="hl-tag">/execution</span>&gt;
&lt;<span class="hl-tag">/executions</span>&gt;
&lt;<span class="hl-tag">/plugin</span>&gt;
</pre><p>
</p><p>
The WAB must be prevented from having its dependencies included in a <code class="literal">lib</code> directory as they should be provided
by the runtime enviroment. The <code class="literal">greenpages.web</code> POM file contains the following:
</p><pre class="programlisting">&lt;<span class="hl-tag">build</span>&gt;
&lt;<span class="hl-tag">plugins</span>&gt;
&lt;<span class="hl-tag">plugin</span>&gt;
&lt;<span class="hl-tag">artifactId</span>&gt;maven-war-plugin&lt;<span class="hl-tag">/artifactId</span>&gt;
&lt;<span class="hl-tag">version</span>&gt;2.1-beta-1&lt;<span class="hl-tag">/version</span>&gt;
&lt;<span class="hl-tag">configuration</span>&gt;
&lt;<span class="hl-tag">packagingExcludes</span>&gt;WEB-INF/lib/**&lt;<span class="hl-tag">/packagingExcludes</span>&gt;
&lt;<span class="hl-tag">/configuration</span>&gt;
&lt;<span class="hl-tag">/plugin</span>&gt;
&lt;<span class="hl-tag">/plugins</span>&gt;
&lt;<span class="hl-tag">/build</span>&gt;</pre><p>
</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1299"></a>Automatically Running the Tests</h3></div></div></div><p>
The following plug-in entry in the <code class="literal">pom.xml</code> file in the <code class="literal">parent</code>
directory ensure that the concrete test classes are run as part of the build:
</p><pre class="programlisting">&lt;<span class="hl-tag">plugin</span>&gt;
&lt;<span class="hl-tag">groupId</span>&gt;org.apache.maven.plugins&lt;<span class="hl-tag">/groupId</span>&gt;
&lt;<span class="hl-tag">artifactId</span>&gt;maven-surefire-plugin&lt;<span class="hl-tag">/artifactId</span>&gt;
&lt;<span class="hl-tag">configuration</span>&gt;
&lt;<span class="hl-tag">includes</span>&gt;
&lt;<span class="hl-tag">include</span>&gt;**/*Tests.java&lt;<span class="hl-tag">/include</span>&gt;
&lt;<span class="hl-tag">/includes</span>&gt;
&lt;<span class="hl-tag">excludes</span>&gt;
&lt;<span class="hl-tag">exclude</span>&gt;**/Abstract*.java&lt;<span class="hl-tag">/exclude</span>&gt;
&lt;<span class="hl-tag">/excludes</span>&gt;
&lt;<span class="hl-tag">junitArtifactName</span>&gt;org.junit:com.springsource.org.junit&lt;<span class="hl-tag">/junitArtifactName</span>&gt;
&lt;<span class="hl-tag">argLine</span>&gt;-javaagent:${user.home}/.m2/repository/&#8230;&lt;<span class="hl-tag">/argLine</span>&gt;
&lt;<span class="hl-tag">/configuration</span>&gt;
&lt;<span class="hl-tag">/plugin</span>&gt;
</pre><p>
The location of the user's Maven repository is hard-coded.
</p></div></div><!--Begin LoopFuse code--><script src="http://loopfuse.net/webrecorder/js/listen.js" type="text/javascript"></script><script type="text/javascript">
_lf_cid = "LF_48be82fa";
_lf_remora();
</script><!--End LoopFuse code--><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s03.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch03.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="apa.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">3.3&nbsp;Testing Highlights&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Appendix&nbsp;A.&nbsp;Further Resources</td></tr></table></div></body></html>