<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" 
      xmlns:thr="http://purl.org/syndication/thread/1.0">
  <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html" />
  <link rel="self" type="application/atom+xml" href="http://www.insideria.com/atom.xml" />
  <id>tag:www.insideria.com,2009://34/tag:www.insideria.com,2008://34.22799-</id>
  <updated>2009-11-16T15:55:50Z</updated>
  <title>Comments for Anatomy of an Enterprise Flex RIA Part 3: The Project&apos;s Structure (http://www.insideria.com/2008/02/the-project-structure.html)</title>
  <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.21-en</generator>
  <entry>
    <id>tag:www.insideria.com,2008://34.22799</id>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blogs.oreilly.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=34/entry_id=22799" title="Anatomy of an Enterprise Flex RIA Part 3: The Project's Structure" />
    <published>2008-02-04T11:00:00Z</published>
    <updated>2008-10-01T01:37:26Z</updated>
    <title>Anatomy of an Enterprise Flex RIA Part 3: The Project&apos;s Structure</title>
    <summary>In the last installment of our Development Series Anatomy of an Enterprise Flex RIA, we looked at the sample code that uses the tools discussed in this series.  Now we&apos;re going to have a look at J2EE project structures and how Maven, a build process and code process management tool, works with them.</summary>
    <author>
      <name>Tony Hillerson</name>
      
    </author>
    
    <category term="Features" />
    
    <content type="html" xml:lang="en" xml:base="http://www.insideria.com/">
      <![CDATA[<p> <div class="ap_r" style="margin: 16px;"><a href="http://www.insideria.com/upload/2008/01/anatomy_of_an_enterprise_flex_1/riaseries_part3.jpg" class="highslide" onclick="return hs.expand(this)"><img src="http://www.insideria.com/upload/2008/01/anatomy_of_an_enterprise_flex_1/riaseries_part3.jpg" alt="riaseries_part3.jpg" title="Click to enlarge" width="148"/></a></div></p>

<p><a href="http://www.insideria.com/2008/01/running-the-sample-code-last.html">Last installment</a> we looked at the sample project we'll be discussing throughout the series. Now we're going to have a look at J2EE project structures and how Maven works with them.</p>

<p>Our project is intended to be deployed to a web platform. There is a Java specification for a deployable web application of this type, called a <span class="orangeinlinecode"><em>web archive</em></span>. The deployment &ldquo;artifact&rdquo; is a ZIP file with a <span class="yellowinlinecode"><em>.war extension</em></span>, so we call these <span class="orangeinlinecode"><em>archives WAR files</em></span>. A WAR file has a certain structure with some specifications on a file called a <span class="orangeinlinecode"><em>deployment descriptor</em></span>, named <span class="redinlinecode"><em>web.xml</em></span>.</p>

<p>Figure 1 shows a sample web archive structure. The root of the archive is treated as the root of the web application, so any <span class="yellowinlinecode"><em>.html</em></span> or other assets can go here&mdash;in this case, <span class="yellowinlinecode"><em>index.html</em></span>. Also in the root is <span class="yellowinlinecode"><em>WEB-INF</em></span>, which contains important files that won&rsquo;t be available to a web user through the browser. <span class="yellowinlinecode"><em>WEB-INF</em></span> contains a directory called <span class="yellowinlinecode"><em>classes</em></span>, which is the root of the classpath of the Java classes available to the application. Also alongside <span class="yellowinlinecode"><em>classes</em></span> is <span class="yellowinlinecode"><em>lib</em></span>, which contains Java libraries that are added to the classpath from JARs. <span class="redinlinecode"><em>web.xml</em></span> goes in the root of <span class="yellowinlinecode"><em>WEB-INF</em></span> and tells the container (server) how to deploy the application.</p>

<div class="ap_r" style="margin: 16px;"><a href="http://www.insideria.com/upload/2008/01/anatomy_of_an_enterprise_flex/anatomy_fig1.png" class="highslide" onclick="return hs.expand(this)"><img src="http://www.insideria.com/upload/2008/01/anatomy_of_an_enterprise_flex/anatomy_fig1.png" alt="anatomy_fig1.png" title="Click to enlarge" width="148"/></a><div class="apcaption">Figure 1. An example web archive.</div></div>
 
Our project will be using EJB 3.0 as the persistence layer. The resources that make up the persistence part of the project will be packaged separately as a JAR, a regular Java archive. Theoretically, a persistence unit could be packaged with any number of applications that need to manage data in the same domain, which is why it&rsquo;s kept in its own artifact. A persistence unit has a specified structure and descriptor file as well, called <span class="yellowinlinecode"><em>persistence.xml</em></span> (see Figure 2).

<div class="ap_r" style="margin: 16px;"><a href="http://www.insideria.com/upload/2008/01/anatomy_of_an_enterprise_flex/anatomy_fig2.png" class="highslide" onclick="return hs.expand(this)"><img src="http://www.insideria.com/upload/2008/01/anatomy_of_an_enterprise_flex/anatomy_fig2.png" alt="anatomy_fig2.png" title="Click to enlarge" width="148"/></a><div class="apcaption">Figure 2. An example persistence unit.</div></div>

<p><br />
A persistence unit is fairly simple inside. The package structure goes in the root alongside <span class="yellowinlinecode"><em>META-INF</em></span>, which contains the descriptor file, <span class="yellowinlinecode"><em>persistence.xml</em></span>.</p>

<p>We will deal with the data persistence part of our code as a separate project and have a separate artifact from the web part of the project. There is another type of specification for a type of archive that holds other archives. This is the Java Enterprise Edition (Java EE) specification for enterprise archives. This type of file is another <span class="yellowinlinecode"><em>.zip</em></span> file, and it has an <span class="yellowinlinecode"><em>.ear</em></span> extension and usually contains only the other archives in the root of the archive. So, we&rsquo;ll put our <span class="yellowinlinecode"><em>.war</em></span> and our <span class="yellowinlinecode"><em>.jar</em></span> in our <span class="yellowinlinecode"><em>.ear</em></span> for deployment. (I know, it sounds funny. Somebody on these specification committees must have had a sense of humor.) Figure 3 shows an example enterprise archive.</p>

<div class="ap_r" style="margin: 16px;"><a href="http://www.insideria.com/upload/2008/01/anatomy_of_an_enterprise_flex/anatomy_fig3.png" class="highslide" onclick="return hs.expand(this)"><img src="http://www.insideria.com/upload/2008/01/anatomy_of_an_enterprise_flex/anatomy_fig3.png" alt="anatomy_fig3.png" title="Click to enlarge" width="148"/></a><div class="apcaption">Figure 3. An example enterprise archive.</div></div>

<p>An enterprise archive is the simplest archive in terms of number of files. Typically, the root contains web archives. Sometimes JARs go in the root for inclusion in the classpath on the server. They could go in a separate <span class="yellowinlinecode"><em>lib</em></span> directory if we wanted them to; it doesn&rsquo;t matter because we can configure that in <span class="yellowinlinecode"><em>application.xml</em></span>. By the way, <span class="yellowinlinecode"><em>application.xml</em></span> goes in <span class="yellowinlinecode"><em>META-INF</em></span> and describes how to load the other included artifacts.</p>

<p>The point of having these arcane specifications for archived files is that you can keep these separate projects by themselves during development, and then have a build tool produce the separate artifacts and combine them into one file which is a self-contained enterprise application with its own deployment instructions inside. This is much more convenient for someone who has to actually deploy these things to a production environment. Separate projects make development easier for developers with different tasks, and a single artifact makes deployment as easy as possible.</p>

<p>One thing to note: you can deploy WAR and EAR archives in their ZIPped, single-file form, or together as an unzipped directory. When deployed unzipped, they&rsquo;re sometimes referred to as being <span class="orangeinlinecode"><em>exploded</em></span>. In development environments, these archives are generally deployed in an exploded form to a local server. Our development Ant tasks will do that for us, as well as keep compiled resources in sync.</p>

<h2>Maven Projects</h2>

<div class="ap_r" style="width:180px;"><a href="http://www.oreilly.com/catalog/9780596514402/?CMP=ILC-dm_nav_related-books" target="_blank"><img border="0" src="http://www.oreilly.com/catalog/covers/9780596514402_cat.gif" width="180" height="233" /></a>
<div class="apcaption"><a href="http://www.oreilly.com/catalog/9780596514402/?CMP=ILC-dm_nav_related-books" target="_blank">Get your copy of Tony Hillerson's Enterprise Application Development with Flex.</a></div></div>Inside <span class="yellowinlinecode"><em>src</em></span> is a directory for the main source of the project, called <span class="yellowinlinecode"><em>main</em></span>. At the same level is a folder for test code, called <span class="yellowinlinecode"><em>test</em></span>. The code goes in the <span class="yellowinlinecode"><em>main</em></span> and <span class="yellowinlinecode"><em>test</em></span> directories and is organized by the type of language&#8212;in this case, a <span class="yellowinlinecode"><em>java</em></span> directory holds the Java code in the data project directory, and a <span class="yellowinlinecode"><em>java</em></span> and <span class="yellowinlinecode"><em>flex</em></span> directory in the web project.  
Maven is a code project management tool as well as a build automation tool. Maven has some opinions about how projects of the type we&rsquo;re working with should be structured. Although all of the defaults can be configured separately, because we&rsquo;re starting a new project I&rsquo;ve followed Maven&rsquo;s conventions, and you can see how they make sense.

<p>Just as Ant has a build file to describe the tasks that control our build, Maven has a file that lets developers describe and configure each project. This file is called <span class="yellowinlinecode"><em>pom.xml</em></span>. POM stands for Project Object Model. Maven has an idea of a set of locations, variables, and steps in the build process that generalize all projects.</p>

<p>The <span class="yellowinlinecode"><em>pom.xml</em></span> descriptor tells Maven some important settings for the project. First, it identifies the project with a name and other attributes. Then it could do one of many other things, such as configure certain plug-ins that work with Maven&mdash;for instance, the compiler plug-in, the testing plug-in, and so on.</p>

<p>Maven also has an extremely powerful dependency management feature. When Maven reads from the POM the list of dependencies, or libraries, that our project relies on, it downloads those libraries from a local repository, which is usually in a directory called <span class="yellowinlinecode"><em>.m2</em></span> and located in your home directory.</p>

<p>If it can&rsquo;t find the library there, it downloads the library from any of a list of known repositories on the Web. It can read this list from a descriptor called <span class="yellowinlinecode"><em>settings.xml</em></span> in your <span class="yellowinlinecode"><em>.m2</em></span> directory.</p>

<p>You may require a little explanation to understand just how powerful this feature is. If you&rsquo;ve ever gone &ldquo;JAR hunting&rdquo; in Java, you know what I mean already. Let&rsquo;s say our project needs a set of classes from Library A. That library depends on a certain version of Library B. Library B depends on Libraries C, D, and E. There&rsquo;s no standard way to let you know that, so you have to hope that Libraries A and B have good documentation and tell you that they depend on these other libraries, and even if you&rsquo;re lucky and they do tell you, you still have to hunt down all these projects and download the artifacts before you can compile your project. Otherwise, Java will complain. </p>

<p>All you&rsquo;d need to do if you were using Maven, however, is to say that your project depended on &ldquo;A&rdquo;, and you&rsquo;d be done, given the fact that &ldquo;B&rdquo;, &ldquo;C&rdquo;, &ldquo;D&rdquo;, and &ldquo;E&rdquo; all made Maven-friendly artifacts and had them posted to the standard Maven repositories. Luckily, most libraries you run into out there do just that. </p>

<p>If not, you can either put the libraries in Maven form in your local repository and share them with all the developers on your project, or use one of the proxy server solutions out there to run your own local Maven repository for your team.</p>

<p>We&rsquo;re going to have work on projects from Maven&rsquo;s point of view. One project will build the EJB 3.0 persistence unit, another will build the web archive with Flex and LCDS integrated, a third will build an <span class="yellowinlinecode"><em>.ear</em></span> file to contain these two artifacts, and the fourth will act as a parent project to the other three. The following code shows the parent project&rsquo;s POM and some of the customization we need to do to tell Maven where things are:</p>

<div class="acode">
  <span class="green">&lt;?</span><span class="purple">xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;</span><span class="green">?&gt;</span><br />
  <span class="green">&lt;</span><span class="red">project ...</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">modelVersion</span><span class="green">&gt;4.0.0&lt;/</span><span class="red">modelVersion</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">groupId</span><span class="green">&gt;lcds.examples.bookie&lt;/</span><span class="red">groupId</span><span class="green">&gt;</span><br />&nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">artifactId</span><span class="green">&gt;bookieProject&lt;/</span><span class="red">artifactId</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">version</span><span class="green">&gt;1.0-SNAPSHOT&lt;/</span><span class="red">version</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">packaging</span><span class="green">&gt;pom&lt;/</span><span class="red">packaging</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">name</span><span class="green">&gt;Bookie Example Parent Project&lt;/</span><span class="red">name</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">modules</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">module</span><span class="green">&gt;bookie-data&lt;/</span><span class="red">module</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">module</span><span class="green">&gt;bookie-ui&lt;/</span><span class="red">module</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">module</span><span class="green">&gt;bookie-ear&lt;/</span><span class="red">module</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp; <span class="green">&lt;/</span><span class="red">modules</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">build</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">plugins</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">plugin</span><span class="green">&gt;</span><br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">groupId</span><span class="green">&gt;org.apache.maven.plugins&lt;/</span><span class="red">groupId</span><span class="green">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">artifactId</span><span class="green">&gt;maven-compiler-plugin&lt;/</span><span class="red">artifactId</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">configuration</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">source</span><span class="green">&gt;1.5&lt;/</span><span class="red">source</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;</span><span class="red">target</span><span class="green">&gt;1.5&lt;/</span><span class="red">target</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;/</span><span class="red">configuration</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;/</span><span class="red">plugin</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="green">&lt;/</span><span class="red">plugins</span><span class="green">&gt;</span><br />
  &nbsp;&nbsp;&nbsp; <span class="green">&lt;/</span><span class="red">build</span><span class="green">&gt;</span><br />
  <span class="green">&lt;/</span><span class="red">project</span><span class="green">&gt;</span></div>

<p>First, <span class="redinlinecode"><em>modelVersion</em></span> says to which version of the POM XML this document is written. It&rsquo;s there in case some of Maven&rsquo;s POM syntax or settings change later.<br /></p>

<p>The next three attributes are the most important. In fact, they&rsquo;re all a POM really needs to have to identify this project from other Maven projects.</p>

<p><span class="redinlinecode">groupId</span> is a unique identifier for the group that&rsquo;s building the project. This usually ends up being the company&rsquo;s URL, but it may be something else unique to the company or organization. This identifier could span projects built by this group.</p>

<p><span class="redinlinecode">artifactId</span> is the unique identifier for the project. In this case, the parent project is called <span class="redinlinecode">bookieProject</span>.</p>

<p>Next comes <span class="redinlinecode">version</span>, which is the version of the project and could be anything, but should be the major version or revision this project is building toward. If the version of the artifact this project produced was 4.1, that would go here. A Maven convention for cases when the project is unreleased and working toward Version 1 is to use <span class="redinlinecode">1.0-SNAPSHOT</span>, which means that no version has been released yet and a lot of changes are happening; too many to pin down a version.</p>

<p>Maven uses these &ldquo;big three&rdquo; attributes to build artifacts. If the project produced a JAR file, the JAR file would be called <span class="yellowinlinecode"><em><strong>&lt;project name&gt;.&lt;version number&gt;.jar</strong></em></span> and it would be placed in Maven repositories under a directory structure matching the <span class="redinlinecode">groupId</span>, <span class="redinlinecode">artifactId</span>, and <span class="redinlinecode">version</span>. For example, Figure 4 shows the repository structure for the MySQL drivers.</p>

<div class="ap_r" style="margin: 16px;"><a href="http://www.insideria.com/upload/2008/01/anatomy_of_an_enterprise_flex/anatomy_fig4.png" class="highslide" onclick="return hs.expand(this)"><img src="http://www.insideria.com/upload/2008/01/anatomy_of_an_enterprise_flex/anatomy_fig4.png" alt="anatomy_fig4.png" title="Click to enlarge" width="148"/></a><div class="apcaption">Figure 4. The repository structure for the MySQL drivers.</div></div>

<p>This is straight out of my local Maven repository, but of course, it mirrors the structure found on any Maven repository on the Web. For the MySQL library, the <span class="redinlinecode">groupId</span> is <span class="redinlinecode">mysql</span> and the <span class="redinlinecode">artifactId</span> is <span class="redinlinecode">mysql-connector-java</span>; in addition, three versions are shown: 3.1.12, 5.0.3, and 5.0.5. Notice also that the JAR is named in the form mentioned earlier, and that the project&rsquo;s POM is stored here as well, alongside some hash files to make sure the files were downloaded without a glitch.</p>

<p>The POM file is stored in the repositories so that, among other things, Maven can check whether this library has any dependencies that it needs to get. The automated checking and downloading of all these dependencies up the chain, based on just a few configuration settings, is worth the price of admission alone.</p>

<p>Back to the parent POM, the <span class="redinlinecode">packaging</span> setting tells Maven how to package the project. In this case, in the parent project there is no artifact, so the packaging is <span class="redinlinecode">pom</span>, which means that we expect to have other projects in directories below this one. Those other projects are listed in the <span class="redinlinecode">modules</span> section under the <span class="redinlinecode">name</span> setting. We&rsquo;ll see the POMs for the <span class="redinlinecode">data</span> and <span class="redinlinecode">ui</span> projects at the beginning of each of their respective sections, and the <span class="redinlinecode">ear</span> project&rsquo;s POM in a bit.</p>

<p>After the <span class="redinlinecode">modules</span> section is a <span class="redinlinecode">build</span> section. This configures the build part of Maven&rsquo;s project life cycle. Basically, we&rsquo;re telling Maven to configure the compiler plug-in, which compiles Java, to consider source files to be 1.5 and to compile to Version 1.5 of Java. Because we configure this at the parent project&rsquo;s setting, Maven keeps this setting for the Java compilation in each child project too.</p>

<p><a href="http://www.insideria.com/2008/02/the-three-child-projects.html">Next installment</a> we'll continue looking at how Maven projects are organized. You can always find the entire series <a href="http://www.insideria.com/series-anatomy-flex.html">here</a>.</p>]]>
      
    </content>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.22799-comment:2014930</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.22799" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html#comment-2014930" />
    <title>Comment from Driveby on 2008-02-06</title>
    <author>
        <name>Driveby</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>Is there an RSS feed specifically for this series?</p>]]>
    </content>
    <published>2008-02-06T19:44:36Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.22799-comment:2014973</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.22799" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html#comment-2014973" />
    <title>Comment from painter on 2008-02-08</title>
    <author>
        <name>painter</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>You can find this series via the author's Atom feed: <br />
<a href="http://www.insideria.com/tony_hillerson/atom.xml">http://www.insideria.com/tony_hillerson/atom.xml</a></p>

<p>Or, you can find all development related content in the Development Atom feed: <br />
<a href="http://www.insideria.com/development/atom.xml">http://www.insideria.com/development/atom.xml</a></p>]]>
    </content>
    <published>2008-02-08T19:05:20Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.22799-comment:2014979</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.22799" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html#comment-2014979" />
    <title>Comment from John on 2008-02-08</title>
    <author>
        <name>John</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>this series is sick.  i am anticipating the fourth part like it is my first born.  so boys, how bout daily posts?</p>]]>
    </content>
    <published>2008-02-09T03:40:25Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.22799-comment:2014999</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.22799" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html#comment-2014999" />
    <title>Comment from John on 2008-02-09</title>
    <author>
        <name>John</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>Was there any particular reason you chose Flex/EJB3 over a Flex/Spring/Hib. stack?</p>]]>
    </content>
    <published>2008-02-10T06:24:16Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.22799-comment:2015024</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.22799" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html#comment-2015024" />
    <title>Comment from Tony Hillerson on 2008-02-11</title>
    <author>
        <name>Tony Hillerson</name>
        <uri>http://thillerson.blogspot.com</uri>
    </author>
    <content type="html" xml:lang="en" xml:base="http://thillerson.blogspot.com">
        <![CDATA[<p>@John - I chose EJB3 because I really liked the annotation style of describing the persistence layer instead of the separate xml descriptor style.</p>

<p>As you know, Hibernate annotations and EJB3 are similar. A lot of what I cover could be used with Sprint/Hibernate, just replace the persistence code with your preferred method. A good exercise for the reader :)</p>]]>
    </content>
    <published>2008-02-11T16:42:26Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.22799-comment:2015027</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.22799" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html#comment-2015027" />
    <title>Comment from John on 2008-02-11</title>
    <author>
        <name>John</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>@Tony</p>

<p>ahhh, convention over configuration.  Thanks for satisfying my curiosity.</p>]]>
    </content>
    <published>2008-02-11T17:42:39Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.22799-comment:2016163</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.22799" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/02/the-project-structure.html#comment-2016163" />
    <title>Comment from Claudio Fainschtein on 2008-03-26</title>
    <author>
        <name>Claudio Fainschtein</name>
        <uri>http://tecav.blogspot.com/</uri>
    </author>
    <content type="html" xml:lang="en" xml:base="http://tecav.blogspot.com/">
        <![CDATA[<p>Hi, I´ve extended the HibernateAssembler to avoid write xml mapping configuration files and use Hibernate/EJB3 annotations, I´ve called it AnnotationHibernateAssembler, it was very easy, need only to override one method, you can see here: <a href="http://tecav.blogspot.com">http://tecav.blogspot.com</a></p>

<p>Saludos!<br />
</p>]]>
    </content>
    <published>2008-03-27T03:16:24Z</published>
  </entry>

</feed
