<?xml version="1.0" encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="https://raibledesigns.com/roller-ui/styles/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" 
      xmlns:app="http://www.w3.org/2007/app"
      xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">

    <title type="html">Search for [ant] in weblog rd</title>
    <subtitle type="html">Search results for [ant] within weblog Raible Designs</subtitle>
    <id>https://raibledesigns.com/rd/feed/entries/atom?q=ant</id>

    <link rel="self" type="application/atom+xml" 
        href="https://raibledesigns.com/rd/feed/entries/atom?q=ant" />

    <link rel="alternate" type="text/html" 
        href="https://raibledesigns.com/rd/search?q=ant" />

    <link rel="search" type="application/opensearchdescription+xml" 
        href="https://raibledesigns.com/roller-services/opensearch/rd" />
    <opensearch:Query role="request" searchTerms="ant" startPage="1" />

    <link rel="first" type="application/atom+xml" href="https://raibledesigns.com/rd/feed/entries/atom?q=ant" />
    <link rel="next" type="application/atom+xml" href="https://raibledesigns.com/rd/feed/entries/atom?q=ant&amp;page=1" />
    <updated>2026-03-30T03:31:45-06:00</updated>
    <generator uri="http://roller.apache.org" version="5.0.3 (1388864191739:dave)">Apache Roller</generator>

        <entry>
        <id>https://raibledesigns.com/rd/entry/jhipsterconf_2018_summer_solstice_in</id>
        <title type="html">JHipster Conf 2018: Summer Solstice in Paris</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/jhipsterconf_2018_summer_solstice_in"/>
        <published>2018-06-28T10:13:27-06:00</published>
        <updated>2018-06-28T16:15:28-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="angular" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipsterconf2018" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="paris" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ippon" scheme="http://roller.apache.org/ns/tags/" />
        <category term="react" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipsterconf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring-boot" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;
Last week, I journeyed to Paris with my son, Jack. It was his first time in Europe and I brought him along for good reason. I&#8217;d been invited to the first ever JHipster Conf, and I was eager to attend. We were both pretty excited when we left Denver last Monday.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 600px&quot;&gt;
&lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned data-instgrm-permalink=&quot;https://www.instagram.com/p/BkLwcPPHvGt/&quot; data-instgrm-version=&quot;8&quot; style=&quot; background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:8px;&quot;&gt; &lt;div style=&quot; background:#F8F8F8; line-height:0; margin-top:40px; padding:37.5% 0; text-align:center; width:100%;&quot;&gt; &lt;div style=&quot; background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAMUExURczMzPf399fX1+bm5mzY9AMAAADiSURBVDjLvZXbEsMgCES5/P8/t9FuRVCRmU73JWlzosgSIIZURCjo/ad+EQJJB4Hv8BFt+IDpQoCx1wjOSBFhh2XssxEIYn3ulI/6MNReE07UIWJEv8UEOWDS88LY97kqyTliJKKtuYBbruAyVh5wOHiXmpi5we58Ek028czwyuQdLKPG1Bkb4NnM+VeAnfHqn1k4+GPT6uGQcvu2h2OVuIf/gWUFyy8OWEpdyZSa3aVCqpVoVvzZZ2VTnn2wU8qzVjDDetO90GSy9mVLqtgYSy231MxrY6I2gGqjrTY0L8fxCxfCBbhWrsYYAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-22px; width:44px;&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;p style=&quot; margin:8px 0 0 0; padding:0 4px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/BkLwcPPHvGt/&quot; style=&quot; color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;&quot; target=&quot;_blank&quot;&gt;Our adventure to Paris begins! #jhipsterconf&lt;/a&gt;&lt;/p&gt; &lt;p style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;&quot;&gt;A post shared by &lt;a href=&quot;https://www.instagram.com/vwsforlife/&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px;&quot; target=&quot;_blank&quot;&gt; Matt Raible&lt;/a&gt; (@vwsforlife) on &lt;time style=&quot; font-family:Arial,sans-serif; font-size:14px; line-height:17px;&quot; datetime=&quot;2018-06-18T23:01:22+00:00&quot;&gt;Jun 18, 2018 at 4:01pm PDT&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;script async defer src=&quot;//www.instagram.com/embed.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;h3 id=&quot;background&quot;&gt;My Background with JHipster&lt;/h3&gt;
&lt;p&gt;
I&#8217;ve been a part of the &lt;a href=&quot;https://www.jhipster.tech&quot;&gt;JHipster&lt;/a&gt; community for a few years now. I joined by accident, really. I was trying to market myself as an independent consultant by spouting my knowledge of Spring Boot and Angular with an InfoQ mini-book. Since JHipster leveraged both to jumpstart app development, it seemed like a perfect fit. I&#8217;ve been a long-time fan of app jumpstarts, having developed my own called AppFuse in days long gone.
&lt;/p&gt;
&lt;p&gt;
Through the process of writing the mini-book, finding issues, and submitting pull requests, I eventually found myself to be a member of the JHipster development team. Through my relationship with JHipster, and it&#8217;s 3.0 release, I found myself intrigued my microservices and how to develop them with Spring Boot, Spring Cloud, all through the generation expertise of JHipster.
&lt;/p&gt;
&lt;p&gt;
I&#8217;ve learned a ton by being part of the project and trying to figure out how all of its options work.
&lt;/p&gt;
&lt;p&gt;
    When I found myself with a &lt;a href=&quot;//raibledesigns.com/rd/entry/life_update_a_summer_to&quot;&gt;full-time job at Stormpath&lt;/a&gt;, I did my best to create a Stormpath module for JHipster. When Okta acquired Stormpath, I added a similar module to my list of things I wanted to write.
&lt;/p&gt;
&lt;p&gt;
When it came time to implement an Okta module, I discovered JHipster&#8217;s OAuth support only worked internally, not with an external OAuth provider, also known as an Identity Provider, or IdP. I mentioned to the JHipster team I thought we could do better and add support for external providers instead. They agreed, and I went to work.
&lt;/p&gt;
&lt;p&gt;
    In hindsight, it was a great decision and not terribly difficult to implement thanks to Spring Security, Keycloak, and Docker. We had a ton of help from the community along the way, and as of last October, &lt;a href=&quot;https://developer.okta.com/blog/2017/10/20/oidc-with-jhipster&quot;&gt;JHipster added support for single sign-on with OIDC&lt;/a&gt; (tested with Keycloak and Okta).
&lt;/p&gt;
&lt;h3 id=&quot;jhipster5&quot;&gt;JHipster 5.0: Spring Boot 2.0, Angular 6, and React&lt;/h3&gt;
&lt;p&gt;It&#8217;s been a fabulous adventure on the JHipster train and it&#8217;s still going strong. We just &lt;a href=&quot;https://www.jhipster.tech/2018/06/20/jhipster-release-5.0.0.html&quot;&gt;released version 5.0&lt;/a&gt; with React and Spring Boot 2.0 support, there&#8217;s client generators for &lt;a href=&quot;https://github.com/oktadeveloper/generator-jhipster-ionic&quot;&gt;Ionic&lt;/a&gt; and &lt;a href=&quot;https://github.com/oktadeveloper/generator-jhipster-ionic&quot;&gt;React Native&lt;/a&gt;, and &lt;a href=&quot;https://jhipster-conf.github.io/&quot;&gt;we just hosted a kick-ass conference about JHipster in Paris&lt;/a&gt;.
&lt;/p&gt;
&lt;h3 id=&quot;jhipsterconf-2018&quot;&gt;JHipster Conf 2018&lt;/h3&gt;
&lt;p&gt;
The conference featured members of the core team, the well-dressed and fit &lt;a href=&quot;https://twitter.com/codefinger&quot;&gt;Joe Kutner&lt;/a&gt; from Heroku, as well as Java celebrities like &lt;a href=&quot;https://twitter.com/saturnism&quot;&gt;Ray Tsang&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/starbuxman&quot;&gt;Josh Long&lt;/a&gt;. You can &lt;a href=&quot;https://blog.ippon.tech/jhipster-conf-2018/&quot;&gt;read about the festivities and presentations from JHipster&apos;s founder&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/juliendubois&quot;&gt;Julien Dubois&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    The conference was a little over 24 hours long, starting with a speaker&#8217;s dinner on Wednesday evening. Before attending, Jack and I spent the day strolling around Versailles. Versailles is a special place in my life since &lt;a href=&quot;https://raibledesigns.com/rd/entry/our_engaging_trip_to_paris&quot;&gt;I proposed to my double rainbow there&lt;/a&gt; after Devoxx Belgium in 2011.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 600px&quot;&gt;
&lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned data-instgrm-permalink=&quot;https://www.instagram.com/p/BkQLlMnnsJo/&quot; data-instgrm-version=&quot;8&quot; style=&quot; background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:8px;&quot;&gt; &lt;div style=&quot; background:#F8F8F8; line-height:0; margin-top:40px; padding:50% 0; text-align:center; width:100%;&quot;&gt; &lt;div style=&quot; background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAMUExURczMzPf399fX1+bm5mzY9AMAAADiSURBVDjLvZXbEsMgCES5/P8/t9FuRVCRmU73JWlzosgSIIZURCjo/ad+EQJJB4Hv8BFt+IDpQoCx1wjOSBFhh2XssxEIYn3ulI/6MNReE07UIWJEv8UEOWDS88LY97kqyTliJKKtuYBbruAyVh5wOHiXmpi5we58Ek028czwyuQdLKPG1Bkb4NnM+VeAnfHqn1k4+GPT6uGQcvu2h2OVuIf/gWUFyy8OWEpdyZSa3aVCqpVoVvzZZ2VTnn2wU8qzVjDDetO90GSy9mVLqtgYSy231MxrY6I2gGqjrTY0L8fxCxfCBbhWrsYYAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-22px; width:44px;&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;p style=&quot; margin:8px 0 0 0; padding:0 4px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/BkQLlMnnsJo/&quot; style=&quot; color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;&quot; target=&quot;_blank&quot;&gt;?? Versailles #working #jhipsterconf&lt;/a&gt;&lt;/p&gt; &lt;p style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;&quot;&gt;A post shared by &lt;a href=&quot;https://www.instagram.com/vwsforlife/&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px;&quot; target=&quot;_blank&quot;&gt; Matt Raible&lt;/a&gt; (@vwsforlife) on &lt;time style=&quot; font-family:Arial,sans-serif; font-size:14px; line-height:17px;&quot; datetime=&quot;2018-06-20T16:15:29+00:00&quot;&gt;Jun 20, 2018 at 9:15am PDT&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;The conference kicked off with &lt;a href=&quot;https://www.slideshare.net/julien.dubois/jhipster-conf-2018-keynote&quot;&gt;a keynote by the JHipster&apos;s co-leads: Julien and Deepu&lt;/a&gt;. 
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 500px&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Full house at &lt;a href=&quot;https://twitter.com/hashtag/JHipsterConf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#JHipsterConf&lt;/a&gt; &lt;a href=&quot;https://twitter.com/java_hipster?ref_src=twsrc%5Etfw&quot;&gt;@java_hipster&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/paris?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#paris&lt;/a&gt; &lt;a href=&quot;https://t.co/nnZ6JmlXrW&quot;&gt;pic.twitter.com/nnZ6JmlXrW&lt;/a&gt;&lt;/p&gt;&amp;mdash; Deepu K Sasidharan (@deepu105) &lt;a href=&quot;https://twitter.com/deepu105/status/1009729525071187969?ref_src=twsrc%5Etfw&quot;&gt;June 21, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 500px&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/wdZWHmGx3zJHnK&quot; width=&quot;500&quot; height=&quot;319&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen&gt; &lt;/iframe&gt; &lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;//www.slideshare.net/julien.dubois/jhipster-conf-2018-keynote&quot; title=&quot;JHipster Conf 2018 keynote&quot; target=&quot;_blank&quot;&gt;JHipster Conf 2018 keynote&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/julien.dubois&quot; target=&quot;_blank&quot;&gt;Julien Dubois&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
During my talk, I had Jack join me on stage for an intro, and tried to give him a taste of public speaking in front of hundreds.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 600px&quot;&gt;
&lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned data-instgrm-permalink=&quot;https://www.instagram.com/p/BkTWAN2HhU-/&quot; data-instgrm-version=&quot;8&quot; style=&quot; background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:8px;&quot;&gt; &lt;div style=&quot; background:#F8F8F8; line-height:0; margin-top:40px; padding:50% 0; text-align:center; width:100%;&quot;&gt; &lt;div style=&quot; background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAMUExURczMzPf399fX1+bm5mzY9AMAAADiSURBVDjLvZXbEsMgCES5/P8/t9FuRVCRmU73JWlzosgSIIZURCjo/ad+EQJJB4Hv8BFt+IDpQoCx1wjOSBFhh2XssxEIYn3ulI/6MNReE07UIWJEv8UEOWDS88LY97kqyTliJKKtuYBbruAyVh5wOHiXmpi5we58Ek028czwyuQdLKPG1Bkb4NnM+VeAnfHqn1k4+GPT6uGQcvu2h2OVuIf/gWUFyy8OWEpdyZSa3aVCqpVoVvzZZ2VTnn2wU8qzVjDDetO90GSy9mVLqtgYSy231MxrY6I2gGqjrTY0L8fxCxfCBbhWrsYYAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-22px; width:44px;&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;p style=&quot; margin:8px 0 0 0; padding:0 4px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/BkTWAN2HhU-/&quot; style=&quot; color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;&quot; target=&quot;_blank&quot;&gt;After a fabulous day at #JHipsterConf and a fun rooftop party at @ippon_technologies , Jack and I enjoyed a romantic dinner and a bit of F&#234;te de la Musique. ??&lt;/a&gt;&lt;/p&gt; &lt;p style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;&quot;&gt;A post shared by &lt;a href=&quot;https://www.instagram.com/vwsforlife/&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px;&quot; target=&quot;_blank&quot;&gt; Matt Raible&lt;/a&gt; (@vwsforlife) on &lt;time style=&quot; font-family:Arial,sans-serif; font-size:14px; line-height:17px;&quot; datetime=&quot;2018-06-21T21:44:16+00:00&quot;&gt;Jun 21, 2018 at 2:44pm PDT&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;
My talk went well, with some successful and some failed demos. Hopefully people got the point that it&#8217;s cool to store your users outside of JHipster so you can share them between apps. I also tried to show that &lt;a href=&quot;https://developer.okta.com/books/api-security/&quot;&gt;OAuth and OIDC are excellent for securing APIs&lt;/a&gt;. You can &lt;a href=&quot;https://speakerdeck.com/mraible/add-sso-to-your-jhipster-apps-with-oidc-jhipsterconf-2018&quot;&gt;download my presentation from Add JHipster to Your JHipster Apps with OIDC&lt;/a&gt; or view it below.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 600px&quot;&gt;
&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;255494c7d9024d99a5ca260cd65085b2&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;I created a tutorial of the app I showed in my talk and published it to the Okta developer blog: &lt;a href=&quot;https://developer.okta.com/blog/2018/06/25/react-spring-boot-photo-gallery-pwa&quot;&gt;Build a Photo Gallery PWA with React, Spring Boot, and JHipster&lt;/a&gt;. If you like React and OAuth, you&apos;re gonna love this guide!
&lt;/p&gt;
&lt;p&gt;
Jack and I had a day in Paris after the conference, so we made the most of it. We hit the Eiffel Tower, hiked the stairs, and marveled at the view. After, we waited in a long line for The Catacombs and walked among the dead.
&lt;/p&gt;
&lt;div style=&quot;margin: 0 auto; max-width: 500px&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I had a wonderful time this week in Paris and at &lt;a href=&quot;https://twitter.com/jhipsterconf?ref_src=twsrc%5Etfw&quot;&gt;@jhipsterconf&lt;/a&gt;. Many thanks to the &lt;a href=&quot;https://twitter.com/java_hipster?ref_src=twsrc%5Etfw&quot;&gt;@java_hipster&lt;/a&gt; developers, community, &lt;a href=&quot;https://twitter.com/juliendubois?ref_src=twsrc%5Etfw&quot;&gt;@juliendubois&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/deepu105?ref_src=twsrc%5Etfw&quot;&gt;@deepu105&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/ippontech?ref_src=twsrc%5Etfw&quot;&gt;@ippontech&lt;/a&gt; for making it all possible! &lt;a href=&quot;https://twitter.com/hashtag/JHipsterConf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#JHipsterConf&lt;/a&gt; &lt;a href=&quot;https://t.co/61ZfRZxg8G&quot;&gt;pic.twitter.com/61ZfRZxg8G&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1010477663943909377?ref_src=twsrc%5Etfw&quot;&gt;June 23, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;h3 id=&quot;kudos&quot;&gt;Kudos to the JHipster Community!&lt;/h3&gt;
&lt;p&gt;
What a trip! It&#8217;s so much fun to be a part of JHipster&#8217;s thriving open source community. It&#8217;s not just the project itself; it&#8217;s all the projects we build upon, from Java to TypeScript to Spring Boot to Spring Data to Spring Security to Angular to React to webpack to Bootstrap. It&#8217;s a conglomeration of all of my favorite tools and open source developers encompassed in several awesome projects!
&lt;/p&gt;
&lt;p&gt;
Life as an open source developer is pretty fun. I encourage you to get involved in open source too! I started way back in the early 2000s with Struts and Ant, and it&#8217;s done wonders for my career.
&lt;/p&gt;
&lt;p&gt;
    &lt;em&gt;Viva La Open Source!&lt;/em&gt;
&lt;/p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/why_i_prefer_intellij_idea</id>
        <title type="html">Why I prefer IntelliJ IDEA over Eclipse</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/why_i_prefer_intellij_idea"/>
        <published>2014-07-21T13:33:55-06:00</published>
        <updated>2014-11-06T20:03:50-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webdevelopment" scheme="http://roller.apache.org/ns/tags/" />
        <category term="intellij" scheme="http://roller.apache.org/ns/tags/" />
        <category term="idea" scheme="http://roller.apache.org/ns/tags/" />
        <category term="eclipse" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;Over the last couple months, I&apos;ve received a few emails asking why I prefer &lt;a href=&quot;http://www.jetbrains.com/idea/&quot;&gt;IntelliJ IDEA&lt;/a&gt; over &lt;a href=&quot;https://www.eclipse.org/&quot;&gt;Eclipse&lt;/a&gt;. They usually go something like this:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I keep seeing you recommending IntelliJ. I keep trying it intermittently with using Eclipse, but I feel like I&apos;m missing something obvious that makes so many people think it&apos;s better. 
Granted having the usual plugins incorporated is nice, but other things like the build process and debugger sometimes seems a step back from Eclipse. Could you please blog a &apos;10 reasons why I love IntelliJ&apos; or point me to something that would clue me in?
&lt;/p&gt;
&lt;p&gt;
I grew to love IntelliJ for a few reasons. It all started in 2006 when I decided to migrate &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; from Ant to Maven. Before that, I was a huge Eclipse fan (2002 - 2006). Before Eclipse, I used HomeSite, an HTML Editor to write all my Java code (1999-2002). Eclipse was the first IDE that didn&apos;t hog all my system&apos;s memory and was pleasant to work with.
&lt;/p&gt;
&lt;p&gt;
The reason I started using IntelliJ in 2006 was because of it&apos;s multi-module Maven support. Eclipse&apos;s Maven support was terrible, and m2e hasn&apos;t gotten a whole lot better in recent years AFAIK. 
&lt;/p&gt;
&lt;p&gt;
Back then, I used to think everything should be built and run from the command line. A couple years later, I realized it was better to run tests and debug from an IDE. Now I&apos;m more concerned with the ability to run tests and debug in an IDE than I am from the build system.
&lt;/p&gt;
&lt;p&gt;
In 2009, I started doing a lot more front-end work: writing HTML, CSS and JavaScript. I also started digging into alternate languages for these: Jade, GWT, CoffeeScript, LESS, SASS - even Scala. I found IntelliJ&apos;s support, and plugins, to be outstanding for these languages and really enjoyed how it would tell me I had invalid JavaScript, HTML and CSS. 
&lt;/p&gt;
&lt;p&gt;
My original passion in software was HTML and JavaScript and I found that hasn&apos;t changed in the last 15 years. AFAIK, Eclipse still has terrible web tools support; it excels at Java (and possibly C++ support). Even today, I write most of my HTML code (&lt;a href=&quot;http://www.infoq.com/author/Matt-Raible&quot;&gt;for InfoQ&lt;/a&gt; and this blog) in IntelliJ.
&lt;/p&gt;
&lt;p&gt;
In reality, it probably doesn&apos;t matter which IDE you use, as long as you&apos;re productive with it. Once you learn one IDE well, the way others do things will likely seem backwards. I&apos;m so familiar with debugging in IntelliJ, that when I tried to use Eclipse&apos;s debugger a few weeks ago, it seemed backwards to me. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In a nutshell: the technologies I&apos;ve worked with have been better embraced by IntelliJ. Has this happened to you? Have certain technologies caused you to use one IDE over another?&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/using_grunt_with_angularjs_for</id>
        <title type="html">Using Grunt with AngularJS for Front End Optimization</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/using_grunt_with_angularjs_for"/>
        <published>2014-01-15T12:15:52-07:00</published>
        <updated>2014-01-15T22:11:46-07:00</updated> 
        <category term="/The Web" label="The Web" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grunt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="pagespeed" scheme="http://roller.apache.org/ns/tags/" />
        <category term="yslow" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;I&apos;m passionate about front end optimization and have been for years. My original inspiration was Steve Souders and his &lt;a href=&quot;http://raibledesigns.com/rd/entry/oscon_2008_even_faster_web&quot;&gt;Even Faster Web Sites talk at OSCON 2008&lt;/a&gt;. Since then, I&apos;ve &lt;a href=&quot;http://raibledesigns.com/rd/entry/javascript_and_css_concatenation&quot;&gt;optimized this blog&lt;/a&gt;, made it even faster &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_look_and_feel_designed&quot;&gt;with a new design&lt;/a&gt;, doubled the speed of several apps for clients and showed how to &lt;a href=&quot;http://raibledesigns.com/rd/entry/improving_appfuse_s_pagespeed_with&quot;&gt;make AppFuse faster&lt;/a&gt;. As part of my &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_2013_a_nordic_countries&quot;&gt;Devoxx 2013 presentation&lt;/a&gt;, I showed &lt;a href=&quot;https://vimeo.com/mraible/page-speed-demo&quot;&gt;how to do page speed optimization in a Java webapp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I developed a couple AngularJS apps last year. To concat and minify their stylesheets and scripts, I used mechanisms that already existed in the projects. On one project, it was Ant and its &lt;a href=&quot;https://ant.apache.org/manual/Tasks/concat.html&quot;&gt;concat task&lt;/a&gt;. On the other, it was part of a Grails application, so I used the &lt;a href=&quot;http://grails.org/plugin/resources&quot;&gt;resources&lt;/a&gt; and &lt;a href=&quot;http://grails.org/plugin/yui-minify-resources&quot;&gt;yui-minify-resources&lt;/a&gt; plugins.
&lt;/p&gt;
&lt;p&gt;The Angular project I&apos;m working on now will be published on a web server, as well as bundled in an iOS native app. Therefore, I turned to &lt;a href=&quot;http://gruntjs.com/&quot;&gt;Grunt&lt;/a&gt; to do the optimization this time. I found it to be quite simple, once I figured out &lt;a href=&quot;http://stackoverflow.com/questions/21056767/angular-and-grunt&quot;&gt;how to make it work with Angular&lt;/a&gt;. Based on my findings, I submitted a &lt;a href=&quot;https://github.com/angular/angular-seed/pull/131&quot;&gt;pull request to add Grunt to angular-seed&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;Below are the steps I used to add Grunt to my Angular project.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I&apos;m passionate about front end optimization and have been for years. My original inspiration was Steve Souders and his &lt;a href=&quot;http://raibledesigns.com/rd/entry/oscon_2008_even_faster_web&quot;&gt;Even Faster Web Sites talk at OSCON 2008&lt;/a&gt;. Since then, I&apos;ve &lt;a href=&quot;http://raibledesigns.com/rd/entry/javascript_and_css_concatenation&quot;&gt;optimized this blog&lt;/a&gt;, made it even faster &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_look_and_feel_designed&quot;&gt;with a new design&lt;/a&gt;, doubled the speed of several apps for clients and showed how to &lt;a href=&quot;http://raibledesigns.com/rd/entry/improving_appfuse_s_pagespeed_with&quot;&gt;make AppFuse faster&lt;/a&gt;. As part of my &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_2013_a_nordic_countries&quot;&gt;Devoxx 2013 presentation&lt;/a&gt;, I showed &lt;a href=&quot;https://vimeo.com/mraible/page-speed-demo&quot;&gt;how to do page speed optimization in a Java webapp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I developed a couple AngularJS apps last year. To concat and minify their stylesheets and scripts, I used mechanisms that already existed in the projects. On one project, it was Ant and its &lt;a href=&quot;https://ant.apache.org/manual/Tasks/concat.html&quot;&gt;concat task&lt;/a&gt;. On the other, it was part of a Grails application, so I used the &lt;a href=&quot;http://grails.org/plugin/resources&quot;&gt;resources&lt;/a&gt; and &lt;a href=&quot;http://grails.org/plugin/yui-minify-resources&quot;&gt;yui-minify-resources&lt;/a&gt; plugins.
&lt;/p&gt;
&lt;p&gt;The Angular project I&apos;m working on now will be published on a web server, as well as bundled in an iOS native app. Therefore, I turned to &lt;a href=&quot;http://gruntjs.com/&quot;&gt;Grunt&lt;/a&gt; to do the optimization this time. I found it to be quite simple, once I figured out &lt;a href=&quot;http://stackoverflow.com/questions/21056767/angular-and-grunt&quot;&gt;how to make it work with Angular&lt;/a&gt;. Based on my findings, I submitted a &lt;a href=&quot;https://github.com/angular/angular-seed/pull/131&quot;&gt;pull request to add Grunt to angular-seed&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;Below are the steps I used to add Grunt to my Angular project.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install Grunt&apos;s command line interface with &quot;sudo npm install -g grunt-cli&quot;.&lt;/li&gt;
&lt;li&gt;Edit package.json to include a version number (e.g. &quot;version&quot;: &quot;1.0.0&quot;).&lt;/li&gt;
&lt;li&gt;Add Grunt plugins in package.json to do concat/minify/asset versioning:
&lt;pre class=&quot;brush: js&quot;&gt;
    &quot;grunt&quot;: &quot;~0.4.1&quot;,
    &quot;grunt-contrib-concat&quot;: &quot;~0.3.0&quot;,
    &quot;grunt-contrib-uglify&quot;: &quot;~0.2.7&quot;,
    &quot;grunt-contrib-cssmin&quot;: &quot;~0.7.0&quot;,
    &quot;grunt-usemin&quot;: &quot;~2.0.2&quot;,
    &quot;grunt-contrib-copy&quot;: &quot;~0.5.0&quot;,
    &quot;grunt-rev&quot;: &quot;~0.1.0&quot;,
    &quot;grunt-contrib-clean&quot;: &quot;~0.5.0&quot;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Run &quot;sudo npm install&quot; to install the project&apos;s dependencies.&lt;/li&gt;
&lt;li&gt;Create a &lt;code&gt;Gruntfile.js&lt;/code&gt; that runs all the plugins.
&lt;pre class=&quot;brush: js&quot;&gt;
module.exports = function (grunt) {

    grunt.initConfig({
        pkg: grunt.file.readJSON(&apos;package.json&apos;),

        clean: [&quot;dist&quot;, &apos;.tmp&apos;],

        copy: {
            main: {
                expand: true,
                cwd: &apos;app/&apos;,
                src: [&apos;**&apos;, &apos;!js/**&apos;, &apos;!lib/**&apos;, &apos;!**/*.css&apos;],
                dest: &apos;dist/&apos;
            },
            shims: {
                expand: true,
                cwd: &apos;app/lib/webshim/shims&apos;,
                src: [&apos;**&apos;],
                dest: &apos;dist/js/shims&apos;
            }
        },

        rev: {
            files: {
                src: [&apos;dist/**/*.{js,css}&apos;, &apos;!dist/js/shims/**&apos;]
            }
        },

        useminPrepare: {
            html: &apos;app/index.html&apos;
        },

        usemin: {
            html: [&apos;dist/index.html&apos;]
        },

        uglify: {
            options: {
                report: &apos;min&apos;,
                mangle: false
            }
        }
    });

    grunt.loadNpmTasks(&apos;grunt-contrib-clean&apos;);
    grunt.loadNpmTasks(&apos;grunt-contrib-copy&apos;);
    grunt.loadNpmTasks(&apos;grunt-contrib-concat&apos;);
    grunt.loadNpmTasks(&apos;grunt-contrib-cssmin&apos;);
    grunt.loadNpmTasks(&apos;grunt-contrib-uglify&apos;);
    grunt.loadNpmTasks(&apos;grunt-rev&apos;);
    grunt.loadNpmTasks(&apos;grunt-usemin&apos;);

    // Tell Grunt what to do when we type &quot;grunt&quot; into the terminal
    grunt.registerTask(&apos;default&apos;, [
        &apos;copy&apos;, &apos;useminPrepare&apos;, &apos;concat&apos;, &apos;uglify&apos;, &apos;cssmin&apos;, &apos;rev&apos;, &apos;usemin&apos;
    ]);
};
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Add comments to app/index.html so usemin knows what files to process. The comments are the important part, your files will likely be different.
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;!-- build:css css/app-name.min.css --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;lib/bootstrap/bootstrap.min.css&quot;/&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;lib/font-awesome/font-awesome.min.css&quot;/&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;lib/toaster/toaster.css&quot;/&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;css/app.css&quot;/&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;css/custom.css&quot;/&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;css/responsive.css&quot;/&amp;gt;
&amp;lt;!-- endbuild --&amp;gt;
...

&amp;lt;!-- build:js js/app-name.min.js --&amp;gt;
&amp;lt;script src=&quot;lib/jquery/jquery-1.10.2.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/bootstrap/bootstrap.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/angular/angular.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/angular/angular-animate.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/angular/angular-cookies.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/angular/angular-resource.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/angular/angular-route.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/fastclick.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/toaster/toaster.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/webshim/modernizr.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/webshim/polyfiller.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;js/app.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;js/services.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;js/controllers.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;js/filters.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;js/directives.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- endbuild --&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A couple of things to note: 1) the &lt;em&gt;copy&lt;/em&gt; task copies the &quot;shims&quot; directory from &lt;a href=&quot;http://afarkas.github.io/webshim/demos/&quot;&gt;Webshims lib&lt;/a&gt; because it loads files dynamically and 2) setting &quot;mangle: false&quot; on the &lt;em&gt;uglify&lt;/em&gt; task is necessary for Angular&apos;s dependency injection to work. I tried to use &lt;a href=&quot;https://npmjs.org/package/grunt-ngmin&quot;&gt;grunt-ngmin&lt;/a&gt; with uglify and had no luck.&lt;/p&gt;
&lt;p&gt;After making these changes, I&apos;m able to run &quot;grunt&quot; and get an optimized version of my app in the &quot;dist&quot; folder of my project. For development, I continue to run the app from my &quot;app&quot; folder, so I don&apos;t currently have a need for watching and processing assets on-the-fly. That could change if I start using LESS or CoffeeScript.
&lt;/p&gt;
&lt;p&gt;The results speak for themselves: from 27 requests to 5 on initial load, and only 3 requests for less than 2K after that.&lt;/p&gt;
&lt;table class=&quot;comparison&quot; style=&quot;max-width: 600px&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;YSlow&lt;/th&gt;
&lt;th&gt;Page Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No optimization&lt;/td&gt;
&lt;td&gt;75 &lt;div style=&quot;float: right&quot;&gt;27 HTTP requests / 464K&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;55/100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache optimization (gzip and expires headers)&lt;/td&gt;
&lt;td&gt;89
&lt;div style=&quot;float: right&quot;&gt;
initial load: 26 requests / 166K&lt;br/&gt;
primed cache: 4 requests / 40K 
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;88/100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache + concat/minified/versioned files&lt;/td&gt;
&lt;td&gt;98
&lt;div style=&quot;float: right&quot;&gt;
initial load: 5 requests / 136K&lt;br/&gt;
primed cache: 3 requests / 1.4K
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;93/100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Andreas Andreou has a &lt;a href=&quot;https://twitter.com/andyhot/status/423571136538877952&quot;&gt;nice tip&lt;/a&gt; on how to reduce the LOC in this example.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add &quot;matchdep&quot; as a dependency in package.json (or run &quot;sudo npm install matchdep --save-dev&quot;).
&lt;pre class=&quot;brush: js; gutter: false&quot;&gt;
&quot;matchdep&quot;: &quot;~0.3.0&quot;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Replace all the &lt;code&gt;grunt.loadNpmTasks(...)&lt;/code&gt; calls with the following:
&lt;pre class=&quot;brush: js; gutter: false&quot;&gt;
require(&apos;matchdep&apos;).filterDev(&apos;grunt-*&apos;).forEach(grunt.loadNpmTasks);
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Thanks Andreas!&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/happy_10_year_appfuse</id>
        <title type="html">Happy 10 Year AppFuse!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/happy_10_year_appfuse"/>
        <published>2013-04-05T08:56:45-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="anniversary" scheme="http://roller.apache.org/ns/tags/" />
        <category term="10years" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//raw.github.com/appfuse/appfuse/master/www/logo/appfuse_72_transparent.gif&quot; width=&quot;72&quot; height=&quot;72&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
10 years ago yesterday, I released the &lt;a href=&quot;http://raibledesigns.com/rd/entry/announce_struts_resume_and_appfuse&quot;&gt;first version of AppFuse&lt;/a&gt;. It started with XDoclet generating ActionForms from POJOs and became very popular for Struts developers that wanted to use Hibernate. The project&apos;s popularity peaked in 2006, as you can see from the mailing list traffic below.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://appfuse.markmail.org&quot; title=&quot;AppFuse Mailing List Traffic&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8251/8621164287_0acb4af5de.jpg&quot; width=&quot;500&quot; height=&quot;162&quot; alt=&quot;AppFuse Mailing List Traffic&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;It&apos;s possible the decrease in traffic is because we re-wrote everything to be based on Maven. It&apos;s also possible it was because of more attractive full-stack frameworks like &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_vs_grails_vs_rails&quot;&gt;Grails and Rails&lt;/a&gt;. However, the real reason is likely that I stopped working on it all the time due to &lt;span style=&quot;text-decoration: line-through&quot;&gt;getting a divorce&lt;/span&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/5_years&quot;&gt;becoming an awesome dad&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below is a timeline of how the project evolved over its first 4 years.&lt;/p&gt;
&lt;p style=&quot;text-align: center; background: white&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/repository/images/appfuse-history.png&quot; rel=&quot;lightbox[appfuse-10yr]&quot; title=&quot;AppFuse History: 2003 - 2007&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/appfuse-history.png&quot; alt=&quot;AppFuse History: 2003 - 2007&quot; width=&quot;500&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;AppFuse has been a great project for me to work on and it&apos;s been a large source of my knowledge about Java, Web Frameworks, Spring, Hibernate - as well as build systems like Ant and Maven. We started with CVS, moved to SVN and now we&apos;re &lt;a href=&quot;http://github.com/appfuse&quot;&gt;on GitHub&lt;/a&gt;. We&apos;ve experienced &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven&quot;&gt;migrating from Tapestry 4 to Tapestry 5&lt;/a&gt; (thanks Serge Eby!), upgrading to &lt;a href=&quot;http://raibledesigns.com/rd/entry/upgrading_to_jsf_2&quot;&gt;JSF 2&lt;/a&gt; and enjoyed the backwards compatibility of Spring and Struts 2 throughout the years. We&apos;ve also added REST support, a Web Services archetype and kept up with the latest Spring and Hibernate releases.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://appfuse.org/download/attachments/84/appfuse-history2.png?version=1&amp;amp;modificationDate=1356633078000&quot; rel=&quot;lightbox[appfuse-10yr]&quot; title=&quot;AppFuse History: 2007 - 2013&quot;&gt;&lt;img src=&quot;//appfuse.org/download/attachments/84/appfuse-history2.png?version=1&amp;amp;modificationDate=1356633078000&quot; width=&quot;500&quot; alt=&quot;AppFuse History: 2007 - 2013&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last year, we &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_2_1_released&quot;&gt;added Bootstrap and jQuery&lt;/a&gt; as foundational front-end frameworks. For our next release, we&apos;re &lt;a href=&quot;http://raibledesigns.com/rd/entry/switching_appfuse_from_myfaces_to&quot;&gt;switching to PrimeFaces&lt;/a&gt;, adding Wicket and changing from jMock to Mockito. Most of these changes are already in source control, we just need to polish them up a bit and add &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+Maven+Plugin&quot; title=&quot;AppFuse Maven Plugin&quot;&gt;AMP&lt;/a&gt; support. I hope to release 3.0 &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157633155884796/&quot;&gt;before the bus is done&lt;/a&gt;. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thanks to all the enthusiastic users of and contributors to AppFuse over the years. It&apos;s been a great ride! </content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/refreshing_taleo_s_ui_with</id>
        <title type="html">Refreshing Taleo&apos;s UI with HTML5, Twitter Bootstrap and CSS3</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/refreshing_taleo_s_ui_with"/>
        <published>2012-08-20T12:27:21-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/The Web" label="The Web" />
        <category term="taleo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="css3" scheme="http://roller.apache.org/ns/tags/" />
        <category term="html5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="twitterbootstrap" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Back in December, I wrote about &lt;a href=&quot;http://raibledesigns.com/rd/entry/what_have_i_been_working&quot;&gt;what I&apos;ve been working on at Taleo&lt;/a&gt;. Shortly after finishing up the Profile Picture, Talent Card and Org Chart features for TBE, I spent two weeks doing page speed optimization. By following &lt;a href=&quot;http://code.google.com/speed/page-speed/docs/rules_intro.html&quot;&gt;Web Performance Best Practices&lt;/a&gt;, I was able to make the TBE application twice as fast and improve its score into the low 90s. 
&lt;/p&gt;
&lt;p&gt;
Next, I started working on a new project - refreshing the UI. &lt;a href=&quot;http://www.linkedin.com/pub/nick-morgan/1/449/637&quot;&gt;Nick&lt;/a&gt;, the Lead UX Designer at Taleo (at the time), had developed a number of mockups and presented it to the developers and product folks in early November. I listened to a WebEx of that meeting and learned that everyone thought it&apos;d take 6-9 months to complete the work. They figured they could release the new design in Q3 2012.  
&lt;/p&gt;
&lt;p&gt;Since I like to provide high-value for my clients, I offered to help with the redesign and do a spike to help estimate. They agreed it&apos;d be a good use of my time and I started working on it the week before Christmas. Since I&apos;d used &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;Twitter Bootstrap&lt;/a&gt; for my &lt;a href=&quot;http://raibledesigns.com/rd/entry/migrating_to_play_2_and&quot;&gt;&lt;em&gt;Play More!&lt;/em&gt; app&lt;/a&gt;, I recommended we use it as a foundation of the redesign. They agreed and I went to work. By the end of the week, I&apos;d made good progress and told them I thought the redesign was possible in 2-3 months (including QA and cross-browser compatibility).&lt;/p&gt;
&lt;p&gt;When I came back to work in January, we decided to split the redesign into two phases. Rather than moving elements around and introducing new features, we decided to do that in the 2nd phase. The 1st phase would entail simply re-skinning the existing UI, with minimal HTML changes. I spent a week refining my spike and integrating it into a branch. The next week, I switched images from individual images to &lt;a href=&quot;http://www.alistapart.com/articles/sprites&quot;&gt;CSS sprites&lt;/a&gt;. Next, I implemented a new theming system with different colors/icons and got everything looking good in Chrome, Safari and IE8/9. 
&lt;/p&gt;
&lt;p&gt;The result is something I&apos;m quite proud of. IE8 doesn&apos;t have the rounded corners (via border-radius), but it still looks good. Forms look much better thanks to Bootstrap&apos;s styling and even jQuery UI&apos;s widgets look good thanks to &lt;a href=&quot;http://addyosmani.github.com/jquery-ui-bootstrap/&quot;&gt;jQuery UI Bootstrap&lt;/a&gt;. I did have to override quite a few Bootstrap styles in the process, but the result is something that doesn&apos;t look too &lt;em&gt;bootstrappy&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;One technique I found to be extremely useful during this process was to pair with Nick (the designer) as mentioned in &lt;a href=&quot;http://www.alistapart.com/articles/building-twitter-bootstrap/&quot;&gt;Building Twitter Bootstrap&lt;/a&gt;. At one point, when we were trying to refine slight nuances and spacing in the UI, I paired with the Product Manager and found this to be a real time-saving effort as well.&lt;/p&gt;

&lt;p&gt;Taleo&apos;s UI Refresh project has been a great experience for me in sharpening my CSS skills. I used quite a bit of &lt;a href=&quot;http://css-tricks.com/child-and-sibling-selectors/&quot;&gt;child and sibling selectors&lt;/a&gt;, which work great in all the browser&apos;s we&apos;re supporting. Also, by using CSS sprites and colors (vs. images), I was able to get the manual theme-creation process down to around 15 minutes. After getting the manual process greatly reduced, I wrote a Theme Generator (based on Ant, LESS and &lt;a href=&quot;http://code.google.com/p/wro4j/&quot;&gt;wro4j&lt;/a&gt;) and got it down to mere minutes. I found &lt;a href=&quot;http://www.spritecow.com/&quot;&gt;Sprite Cow&lt;/a&gt; to be an invaluable resources for working with CSS sprites.
&lt;/p&gt;
&lt;p&gt;Below are some before and after shots of what we&apos;ve been able to accomplish in the first quarter of this year.
&lt;/p&gt;  
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm8.staticflickr.com/7159/6777477811_66d6401bd9_b.jpg&quot; rel=&quot;lightbox[taleo-uirefresh]&quot; title=&quot;Old UI - My View&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7159/6777477811_66d6401bd9_m.jpg&quot; width=&quot;240&quot; height=&quot;148&quot; alt=&quot;Old UI - My View&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;http://farm8.staticflickr.com/7007/6777477639_4ca42665a7_b.jpg&quot; rel=&quot;lightbox[taleo-uirefresh]&quot; title=&quot;Old UI - New Employee&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7007/6777477639_4ca42665a7_m.jpg&quot; style=&quot;margin-left: 10px&quot; width=&quot;240&quot; height=&quot;148&quot; alt=&quot;Old UI - New Employee&quot;&gt;&lt;/a&gt;
&lt;p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  
  &lt;a href=&quot;http://farm8.staticflickr.com/7022/6777477527_b1abb3b204_b.jpg&quot; rel=&quot;lightbox[taleo-uirefresh]&quot; title=&quot;New UI - My View&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7022/6777477527_b1abb3b204_m.jpg&quot; width=&quot;240&quot; height=&quot;148&quot; alt=&quot;New UI - My View&quot;&gt;&lt;/a&gt;
  
  &lt;a href=&quot;http://farm8.staticflickr.com/7162/6777477443_37241a4e85_b.jpg&quot; rel=&quot;lightbox[taleo-uirefresh]&quot; title=&quot;New UI - New Employee&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7162/6777477443_37241a4e85_m.jpg&quot; style=&quot;margin-left: 10px&quot; width=&quot;240&quot; height=&quot;148&quot; alt=&quot;New UI - New Employee&quot;&gt;&lt;/a&gt;  
  &lt;/p&gt;
  &lt;p&gt;
I originally wrote this post at the end of January. We ran into some stumbling blocks shorty after its original composition: Nick (the designer) moved onto &lt;a href=&quot;http://www.salesforce.com/&quot;&gt;greener pastures&lt;/a&gt; and &lt;a href=&quot;http://www.businessweek.com/news/2012-02-10/oracle-buys-taleo-for-1-9-billion-adds-human-resource-tool.html&quot;&gt;Oracle bought Taleo&lt;/a&gt;. What I didn&apos;t expect when I wrote this was to spend the next two months fixing slight bugs that occurred with spacing, alignment and dependent applications I didn&apos;t know about at the time. And then there was IE7. We didn&apos;t realize we needed to support it until mid-March. Then it took us around a month to make it all work &lt;em&gt;good enough&lt;/em&gt;. 
&lt;/p&gt;
&lt;p&gt;The good news is the UI Refresh was released a few months ago and seems to be humming along just fine. Sure, there were slight nuances and customizations we had conflicts with (clashing CSS classes), but overall it seems to have gone well. I can&apos;t thank the Bootstrap developers enough for motivating us to move to HTML5 and CSS3. Also, cheers to the excellent co-workers that helped make this happen: &lt;a href=&quot;http://www.linkedin.com/in/mnewton&quot;&gt;Murray Newton&lt;/a&gt; (Product Manager) and &lt;a href=&quot;http://www.linkedin.com/in/vladimirbazarsky&quot;&gt;Vladimir Bazarsky&lt;/a&gt;. I couldn&apos;t have done it without you guys.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/what_have_i_been_working</id>
        <title type="html">What have I been working on at Taleo?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/what_have_i_been_working"/>
        <published>2011-12-09T12:57:36-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="javascript" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jquery" scheme="http://roller.apache.org/ns/tags/" />
        <category term="happiness" scheme="http://roller.apache.org/ns/tags/" />
        <category term="overstock" scheme="http://roller.apache.org/ns/tags/" />
        <category term="taleo" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">2011 has been a year of great clients for me. I started working with &lt;a href=&quot;http://overstock.com&quot;&gt;O.co&lt;/a&gt; and very much enjoyed my time there, especially on &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_greatest_snow_on_earth&quot;&gt;powder days in Utah&lt;/a&gt;. The people were great, the contract was great (no end date), but the work was not my forte. I was on a project to &lt;em&gt;modularize&lt;/em&gt; the main shopping site&apos;s codebase, which involved mostly refactoring. By refactoring, I mean creating new Maven projects, modifying lots of pom.xml files and literally moving files from one directory to another. IntelliJ made this easy, the hard part was refactoring tests, moving from EasyMock to Mockito and splitting classes into interfaces and implementations where appropriate. As a developer who likes developing UIs and visually seeing my accomplishments, the project wasn&apos;t that exciting. However, I knew that it was strategically important to O.co, so I didn&apos;t complain much.
&lt;/p&gt;
&lt;p&gt;In mid-May, I received a &lt;a href=&quot;http://www.linkedin.com&quot;&gt;LinkedIn&lt;/a&gt; message from the Director of Software Engineering at &lt;a href=&quot;http://www.taleo.com/&quot;&gt;Taleo&lt;/a&gt;. 
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
This is OB, I am the Director of Software Engineering at Taleo. We are the 2nd largest Software as a Service company. I am building a new specialist UI team that will take the product to the next level. I am looking for someone to lead this initiative. If you are interested to have a chat about it, please let me know.
&lt;/p&gt;
&lt;p&gt;At that time, I&apos;d never heard of Taleo and quickly recommended they not hire me.&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
This probably isn&apos;t the best position for me. While I am a good leader, I&apos;m not willing to relocate from Denver. I&apos;ve found that leaders usually do best when face-to-face with their developers.
&lt;/p&gt;
&lt;p&gt;This conversation continued back-and-forth where I explained how I wasn&apos;t willing to go full-time and I didn&apos;t want to leave Overstock. In the end, OB was persistent and explained how the position would entail lots of UI work and wouldn&apos;t require me to travel much. Our negotiations trailed off in June and resumed in July after I returned &lt;a href=&quot;http://raibledesigns.com/rd/entry/4th_of_july_adventures_in&quot;&gt;from vacation in Montana&lt;/a&gt;. Shortly after, we met each other&apos;s expectations, agreed on a start date and I started working at Taleo in early September. 
&lt;/p&gt;
&lt;p&gt;When I started, there were three features they wanted to add to to &lt;a href=&quot;http://www.taleo.com/solutions/taleo-business-edition&quot;&gt;Taleo Business Edition&lt;/a&gt;: Profile Pictures, Talent Cards and Org Charts. They knew the schedule was tight (8 weeks), but I was confident I could make it happen. At first, I groaned at the fact that they were using Ant to build the project. Then I smiled when I learned they&apos;d standardized on IntelliJ and set things up so you could do everything from the IDE. After using Maven for many years, this setup has actually become refreshing and I rarely have to restart or long for something like JRebel. Of course, a &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_macbook_pro_and_imac&quot;&gt;new kick-ass laptop&lt;/a&gt; and &lt;a href=&quot;http://blogs.jetbrains.com/idea/2011/12/intellij-idea-11-is-out-get-ready-for-a-productivity-takeoff/&quot;&gt;awesome IDE&lt;/a&gt; make it so I rarely wait for anything to happen.
&lt;/p&gt;
&lt;p&gt;
To give you a taste of how I implemented each of these new features in 8 weeks, I&apos;ve broken them into sections below.
&lt;/p&gt;
&lt;p id=&quot;profile-pictures&quot;&gt;&lt;strong&gt;Profile Pictures&lt;/strong&gt;&lt;br/&gt;
Adding profile pictures was a pretty simple concept, one you see on my social networking sites today. I needed to give users the ability to upload a JPEG or PNG and crop it so it looked good. The uploading was a pretty straightforward process and I used a lot of internal APIs to grab the file from the request and save it to disk. The more difficult part was scaling the image to certain dimensions on upload (to save space) and allowing users to crop it after. 
&lt;/p&gt;
&lt;p&gt;Most of Taleo Business Edition (TBE) is written in good ol&apos; servlets and JSPs, with lots of scriptlets in their JSPs. When I saw the amount of HTML produced from Java, I laughed out loud and cringed. Soon after, I breathed a sigh of relief when I learned that any new features could be written using &lt;a href=&quot;http://freemarker.sourceforge.net/&quot;&gt;FreeMarker&lt;/a&gt; templates, which IntelliJ has excellent support for.
&lt;/p&gt;
&lt;p&gt;For image resizing on upload, I used Chris Campbell&apos;s &lt;a href=&quot;http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html&quot;&gt;Image.getScaledInstance() tutorial&lt;/a&gt;. For creating thumbnails, I used a combination of scaling, &lt;a href=&quot;http://docs.oracle.com/javase/6/docs/api/java/awt/image/BufferedImage.html#getSubimage(int, int, int, int)&quot;&gt;getSubimage()&lt;/a&gt; and the &lt;a href=&quot;http://docs.oracle.com/javase/6/docs/api/javax/imageio/package-summary.html&quot;&gt;Java Image I/O API&lt;/a&gt;. I made sure to &lt;a href=&quot;http://stackoverflow.com/questions/3204280/is-imageio-write-buffered&quot;&gt;write to BufferedOutputStream&lt;/a&gt; for scalability. For cropping images client-side, I used &lt;a href=&quot;http://jqueryui.com/demos/dialog/&quot;&gt;jQuery UI&apos;s Dialog&lt;/a&gt; and &lt;a href=&quot;http://deepliquid.com/content/Jcrop.html&quot;&gt;Jcrop&lt;/a&gt;, the jQuery image cropping plugin. Below is a screenshot of what the cropping UI looks like:
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm8.staticflickr.com/7142/6475456591_6831fd119e_b.jpg&quot; title=&quot;Taleo&apos;s TBE: Profile Picture&quot; rel=&quot;lightbox[taleo]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7142/6475456591_6831fd119e.jpg&quot; width=&quot;500&quot; height=&quot;176&quot; alt=&quot;Taleo&apos;s TBE: Profile Picture&quot;&gt;&lt;/a&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p id=&quot;talent-cards&quot;&gt;&lt;strong&gt;Talent Cards&lt;/strong&gt;&lt;br/&gt;
Talent Cards were a whole different beast. Not only did they need to display profile pictures, they also needed to contain contact information, work history and a number of other data points. Not just for employees, but for candidates as well. 
They also needed to be rendered with tabs at the bottom that allowed you to navigate between different data sections. 
&lt;/p&gt;
&lt;p&gt;

&lt;a href=&quot;http://farm8.staticflickr.com/7032/6475456677_ae342be56e_o.png&quot; title=&quot;Taleo&apos;s TBE: Talent Card&quot; rel=&quot;lightbox[taleo]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7032/6475456677_a06514020d_m.jpg&quot; width=&quot;187&quot; height=&quot;240&quot; alt=&quot;Taleo&apos;s TBE: Talent Card&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;

I&apos;ll admit, most of the hard work for this feature was done by the server-side developers (Harish and &lt;a href=&quot;http://www.linkedin.com/in/vladimirbazarsky&quot;&gt;Vlad&lt;/a&gt;) on my team. Vlad built the tabbed interface and Harish built the administrative section that allows you to add/remove/sort fields, as well as show and hide certain tabs. I performed most of my magic with jQuery, its &lt;a href=&quot;http://plugins.learningjquery.com/cluetip/&quot;&gt;clueTip plugin&lt;/a&gt; and good ol&apos; CSS. I was particularly thankful for CSS3 and its border-radius, box-shadow and Justin Maxwell&apos;s tutorial on &lt;a href=&quot;http://mattsnider.com/css/css-string-truncation-with-ellipsis/&quot;&gt;CSS String Truncation with Ellipsis&lt;/a&gt;. I used &lt;a href=&quot;http://directwebremoting.org/dwr/index.html&quot;&gt;DWR&lt;/a&gt; to fetch all the data from the server using Ajax. 
&lt;/p&gt;
&lt;p&gt;Talent Cards are a slick feature in TBE 11.5 and I think they&apos;re a great way to see a lot of information about someone very quickly. If you enable them for your company, you&apos;ll be able to mouse over any employee or candidate&apos;s names and see their information.
&lt;/p&gt;
&lt;p id=&quot;org-chart&quot;&gt;&lt;strong&gt;Org Chart&lt;/strong&gt;&lt;br/&gt;
The last feature I completed in this 8-week sprint was creating an organization chart. For this, I was given a rough prototype based on &lt;a href=&quot;http://www.capricasoftware.co.uk/corp/index.php&quot;&gt;Caprica Software&apos;s&lt;/a&gt; &lt;a href=&quot;http://www.capricasoftware.co.uk/jquery/orgchart/orgchart.html&quot;&gt;JQuery/CSS Organisation Chart&lt;/a&gt;. When I received it, it had all kinds of cool CSS 3 transformations (like &lt;a href=&quot;http://css3.bradshawenterprises.com/flip/&quot;&gt;this one&lt;/a&gt;), but they only worked in Safari and Chrome. I ended up removing the transformations and adding the ability to navigate up and down the org tree with Ajax (we currently only show three levels at a time). 
&lt;/p&gt;
&lt;p&gt;
The Org Chart feature also allows you to see how many direct/indirect reports an employee has, as well as access their Talent Card by hovering over their name. It&apos;s one of my favorite features because it&apos;s so visual and because it builds upon all the other features we&apos;ve built.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;http://farm8.staticflickr.com/7148/6483181659_619285347d_o.png&quot; rel=&quot;lightbox[taleo]&quot; title=&quot;Taleo&apos;s TBE: Org Chart&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7148/6483181659_7434afaeee.jpg&quot; width=&quot;487&quot; height=&quot;500&quot; alt=&quot;Taleo&apos;s TBE: Org Chart&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
As you might&apos;ve guessed by now, I&apos;ve been having a lot of fun doing UI development over the last few months. While I seem to have a knack for backend Java development, I enjoy developing UIs a lot more. The smile you see on people&apos;s faces during demos is priceless. I can&apos;t help but think this kind of thing contributes greatly to my developer happiness. All these features will be in next week&apos;s release of TBE and I couldn&apos;t be happier.
&lt;/p&gt;
&lt;p&gt;If you&apos;d like to work on my team at Taleo (or even take over my current role as UI Architect), please &lt;a href=&quot;http://raibledesigns.com/contact.jsp&quot;&gt;drop me a line&lt;/a&gt;. If you live near their headquarters (Dublin, CA), it&apos;d also be great to see you at the next Silicon Valley Spring User Group meetup. I&apos;ll be speaking about &lt;a href=&quot;http://www.meetup.com/SV-SUG/events/43376082/&quot;&gt;What&apos;s New in Spring 3.1 on February 1st&lt;/a&gt;.
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/integrating_html5_boilerplate_with_scalate</id>
        <title type="html">Integrating HTML5 Boilerplate with Scalate and Play</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/integrating_html5_boilerplate_with_scalate"/>
        <published>2011-09-28T08:49:35-06:00</published>
        <updated>2012-06-25T22:46:30-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="scalate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx2011" scheme="http://roller.apache.org/ns/tags/" />
        <category term="html5boilerplate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="coffeescript" scheme="http://roller.apache.org/ns/tags/" />
        <category term="play-more" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">HTML5 Boilerplate is a project that provides a number of basic files to help you build an HTML5 application. At its core, it&apos;s an HTML template that puts CSS at the top, JavaScript at the bottom, installs Chrome Frame for IE6 users and leverages Modernizr for legacy browser support. It also includes jQuery with the download. One of the major benefits of HTML5 Boilerplate is it ships with a build system (powered by Ant) that concatenates and minimizes CSS and JS for maximum performance. From &lt;a href=&quot;http://html5boilerplate.com/&quot;&gt;html5boilerplate.com&lt;/a&gt;:
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
Boilerplate is not a framework, nor does it prescribe any philosophy of development, it&apos;s just got some tricks to get your project off the ground quickly and right-footed.
&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;
I like the idea of its build system to minify and gzip, but I&apos;d probably only use it if I was working on a project that uses Ant. Since I&apos;m using it in a Play project, the whole Ant build system doesn&apos;t help me. Besides, I prefer something like &lt;a href=&quot;http://code.google.com/p/wro4j/&quot;&gt;wro4j&lt;/a&gt;. Wro4j allows you to specify a group of files and then it compiles, minimizes and gzips them all on-the-fly. As far as I know, Play doesn&apos;t have any support for Servlet Filters, so using wro4j in Play is not trivial.
&lt;/p&gt;
&lt;p&gt;
The good news is Play has a &lt;a href=&quot;http://www.playframework.org/modules/greenscript&quot;&gt;GreenScript module&lt;/a&gt; that contains much of the wro4j functionality. However, since I&apos;m using &lt;a href=&quot;http://scalate.fusesource.org/presentations/scalate#(1)&quot;&gt;Scalate&lt;/a&gt; in my project, this goodness is unavailable to me. In the future, the Scalate Team is considering adding &lt;a href=&quot;http://groups.google.com/group/scalate/browse_thread/thread/2904bbdc8ca9dd46&quot;&gt;better wro4j, JavaScript and CSS integration&lt;/a&gt;. In the meantime, I&apos;m going to pretend I don&apos;t care about concatenation and minimization and trundle along without this feature.
&lt;/p&gt;
&lt;p&gt;To add HTML5 Boilerplate to my Play project, I performed the following steps:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Downloaded the &lt;a href=&quot;http://github.com/paulirish/html5-boilerplate/zipball/v2.0&quot;&gt;2.0 Zipball&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Copied all the static files to my project. Below are the commands I used (where &lt;em&gt;$boilerplate-download&lt;/em&gt; is the expanded download directory and &lt;em&gt;~/dev/play-more&lt;/em&gt; is my project):
&lt;pre style=&quot;margin-top: 5px&quot;&gt;
cd $boilerplate-download
cp 404.html ~/dev/play-more/app/views/errors/404.html
cp *.png ~/dev/play-more/public/.
cp crossdomain.xml ~/dev/play-more/public/.
cp -r css ~/dev/play-more/public/stylesheets/.
cp favicon.ico ~/dev/play-more/public/.
cp humans.txt ~/dev/play-more/public/.
cp -r js/libs ~/dev/play-more/public/javascripts/.
cp robots.txt ~/dev/play-more/public/.
&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;Copied the index.html to &lt;em&gt;~/dev/play-more/app/templates/layouts/default.jade&lt;/em&gt; and modified it to use &lt;a href=&quot;http://scalate.fusesource.org/documentation/jade.html&quot;&gt;Jade syntax&lt;/a&gt;. Since I downloaded the comments-heavy version, I modified many of them to be hidden in the final output.
&lt;pre class=&quot;brush: xml&quot;&gt;
-@ val body: String 
-@ var title: String = &quot;Play More&quot;
-@ var header: String = &quot;&quot;
-@ var footer: String = &quot;&quot;
!!! 5
/ paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ 
&amp;lt;!--&amp;#91;if lt IE 7&amp;#93;&amp;gt; &amp;lt;html class=&quot;no-js ie6 oldie&quot; lang=&quot;en&quot;&amp;gt; &amp;lt;!&amp;#91;endif&amp;#93;--&amp;gt;
&amp;lt;!--&amp;#91;if IE 7&amp;#93;&amp;gt;    &amp;lt;html class=&quot;no-js ie7 oldie&quot; lang=&quot;en&quot;&amp;gt; &amp;lt;!&amp;#91;endif&amp;#93;--&amp;gt;
&amp;lt;!--&amp;#91;if IE 8&amp;#93;&amp;gt;    &amp;lt;html class=&quot;no-js ie8 oldie&quot; lang=&quot;en&quot;&amp;gt; &amp;lt;!&amp;#91;endif&amp;#93;--&amp;gt;
-# Consider adding an manifest.appcache: h5bp.com/d/Offline 
&amp;lt;!--&amp;#91;if gt IE 8&amp;#93;&amp;gt;&amp;lt;!--&amp;gt; &amp;lt;html class=&quot;no-js&quot; lang=&quot;en&quot;&amp;gt; &amp;lt;!--&amp;lt;!&amp;#91;endif&amp;#93;--&amp;gt;
head
  meta(charset=&quot;utf-8&quot;)

  -# Use the .htaccess and remove these lines to avoid edge case issues. More info: h5bp.com/b/378 
  meta(http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge,chrome=1&quot;)

  title=title
  meta(name=&quot;description&quot; content=&quot;&quot;)
  meta(name=&quot;author&quot; content=&quot;Matt Raible ~ matt@raibledesigns.com&quot;)

  -# Mobile viewport optimized: j.mp/bplateviewport 
  meta(name=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1&quot;)

  -# Place favicon.ico and apple-touch-icon.png in the root directory: mathiasbynens.be/notes/touch-icons

  -# CSS: implied media=all
  link(rel=&quot;stylesheet&quot; href={uri(&quot;/public/stylesheets/style.css&quot;)})
  -# end CSS

  -# More ideas for your &amp;lt;head&amp;gt; here: h5bp.com/d/head-Tips 
  -#
    All JavaScript at the bottom, except for Modernizr / Respond.
    Modernizr enables HTML5 elements &amp;amp; feature detects; Respond is a polyfill for min/max-width CSS3 Media Queries
    For optimal performance, use a custom Modernizr build: www.modernizr.com/download/ 

  script(type=&quot;text/javascript&quot; src={uri(&quot;/public/javascripts/libs/modernizr-2.0.6.min.js&quot;)})
body
  #container
    header = header
    #main(role=&quot;main&quot;)
      != body
    footer = footer

  -# JavaScript at the bottom for fast page loading 
  
  / Grab Google CDN&apos;s jQuery, with a protocol relative URL; fall back to local if offline 
  script(type=&quot;text/javascript&quot; src=&quot;//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js&quot;)
  :javascript
    window.jQuery || document.write(&apos;&amp;lt;script src={uri(&quot;/public/javascripts/libs/jquery-1.6.2.min.js&quot;)}&amp;gt;&amp;lt;\/script&amp;gt;&apos;)

  -# Change UA-XXXXX-X to be your site&apos;s ID 
  :javascript
    window._gaq = &amp;#91;&amp;#91;&apos;_setAccount&apos;,&apos;UA-25859875-1&apos;&amp;#93;,&amp;#91;&apos;_trackPageview&apos;&amp;#93;,&amp;#91;&apos;_trackPageLoadTime&apos;&amp;#93;&amp;#93;;
    Modernizr.load({
      load: (&apos;https:&apos; == location.protocol ? &apos;//ssl&apos; : &apos;//www&apos;) + &apos;.google-analytics.com/ga.js&apos;
    });

  -# Prompt IE 6 users to install Chrome Frame. Remove this if you want to support IE 6. 
  -# http://chromium.org/developers/how-tos/chrome-frame-getting-started 
  /&amp;#91;if lt IE 7&amp;#93;
    script(src=&quot;//ajax.googleapis.com/ajax/libs/chrome-frame/1.0.3/CFInstall.min.js&quot;)
    :javascript
      window.attachEvent(&apos;onload&apos;,function(){CFInstall.check({mode:&apos;overlay&apos;})})
        
!= &quot;&amp;lt;/html&amp;gt;&quot;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Next, I had to add support for layouts to my &lt;a href=&quot;http://raibledesigns.com/rd/entry/integrating_scalate_and_jade_with&quot;&gt;homegrown Scalate support&lt;/a&gt;. I did this by specifying a &lt;code&gt;layoutStrategy&lt;/code&gt; when initializing the TemplateEngine. From &lt;em&gt;play-more/app/controllers/ScalateTemplate.scala&lt;/em&gt;:
&lt;pre class=&quot;brush: scala&quot;&gt;
engine.classLoader = Play.classloader
engine.layoutStrategy = new DefaultLayoutStrategy(engine, 
  Play.getFile(&quot;/app/templates/layouts/default&quot; + scalateType).getAbsolutePath)
engine
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s it! Now I have HTML5 Boilerplate integrated into my Play/Scalate/Jade application. To set the title and header in my &lt;em&gt;index.jade&lt;/em&gt;, I simply added the following lines at the top:&lt;/p&gt;
&lt;pre class=&quot;brush: scala&quot;&gt;
- attributes(&quot;title&quot;) = &quot;Counting&quot;
- attributes(&quot;header&quot;) = &quot;HTML5 Rocks!&quot;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CoffeeScript Tip&lt;/strong&gt;&lt;br/&gt;
Yesterday, I mentioned that I was &lt;a href=&quot;http://raibledesigns.com/rd/entry/trying_to_make_coffeescript_work&quot;&gt;having issues getting CoffeeScript to work with Scalate&lt;/a&gt; and that I was going to try and get the in-browser compiler working. First of all, reverting to Scalate 1.4.1 didn&apos;t work because there is no CoffeeScript support in 1.4.1. So I stayed with 1.5.2 and used PandaWood&apos;s &lt;a href=&quot;http://forgivingworm.wordpress.com/2010/09/27/running-coffeescript-in-browser/&quot;&gt;Running CoffeeScript In-Browser Tutorial&lt;/a&gt;. I copied &lt;a href=&quot;http://github.com/jashkenas/coffee-script/raw/master/extras/coffee-script.js&quot;&gt;coffee-script.js&lt;/a&gt; to &lt;em&gt;~/dev/play-more/public/javascripts/libs&lt;/em&gt; and added a reference to it in my default.jade layout:
&lt;/p&gt;
&lt;pre class=&quot;brush: scala&quot;&gt;
-# JavaScript at the bottom for fast page loading 
script(type=&quot;text/javascript&quot; src={uri(&quot;/public/javascripts/libs/coffee-script.js&quot;)})
&lt;/pre&gt;
&lt;p&gt;Then I was able to write CoffeeScript in a .jade template using the following syntax:&lt;/p&gt;
&lt;pre class=&quot;brush: scala&quot;&gt;
:plain
  &amp;lt;script type=&quot;text/coffeescript&quot;&amp;gt;
    alert &quot;hello world&quot;
  &amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
If you&apos;ve integrated HTML5 Boilerplate into your Play application, I&apos;d love to hear about it. Now that I have all the infrastructure in place (Jade, CoffeeScript, HTML5 Boilerplate), I&apos;m looking forward to getting some development done. Who knows, maybe I&apos;ll even come up with my own &lt;a href=&quot;http://www.zeroturnaround.com/blog/play-framework-unfeatures-that-irk-my-inner-geek/&quot;&gt;Play Un-Features That Really Irk My Inner Geek&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/upgraded_to_apache_roller_5</id>
        <title type="html">Upgraded to Apache Roller 5.0, RC4</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/upgraded_to_apache_roller_5"/>
        <published>2011-03-03T11:39:37-07:00</published>
        <updated>2011-03-21T17:38:23-06:00</updated> 
        <category term="/Roller" label="Roller" />
        <category term="apache" scheme="http://roller.apache.org/ns/tags/" />
        <category term="roller" scheme="http://roller.apache.org/ns/tags/" />
        <category term="apacheroller" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last Sunday, &lt;a href=&quot;http://rollerweblogger.org/roller&quot;&gt;Dave Johnson&lt;/a&gt; released &lt;a href=&quot;http://markmail.org/message/5pm2iixwoma64n26&quot;&gt;Apache Roller 5.0, RC4&lt;/a&gt;. Since I&apos;m an Apache Roller committer, and I&apos;ve been seeing issues with comments throwing exceptions on this site, I decided to upgrade. In doing so, I discovered a number of issues. Hopefully by documenting them here, you&apos;ll be able to upgrade from Roller 4 to Roller 5 without any issues.
&lt;/p&gt;
&lt;p&gt;To upgrade, I took a snapshot of my existing site and database and copied them locally. After getting everything setup locally (importing existing database and upgrading it), I started Tomcat and began solving problems.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Database settings - JNDI vs. Properties&lt;/strong&gt;&lt;br/&gt;
With Roller 4, I configured by database settings in a ROOT.xml so they&apos;d be read using JNDI. With Roller 5, I got the following error when I tried to do this.
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;openjpa-2.0.1-r422266:989424 fatal user error&gt; org.apache.openjpa.persistence.ArgumentException:
A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.
       at org.apache.openjpa.jdbc.schema.DataSourceFactory.newDataSource(DataSourceFactory.java:76)
&lt;/pre&gt;
&lt;p&gt;I was able to get around this issue by adding the following to my roller-custom.properties:&lt;/p&gt;
&lt;pre&gt;
database.configurationType=jdbc
database.jdbc.driverClass=com.mysql.jdbc.Driver
database.jdbc.connectionURL=jdbc:mysql://localhost/rollerdb
database.jdbc.username=root
database.jdbc.password=
mail.configurationType=properties
mail.hostname=localhost
&lt;/pre&gt;
&lt;p&gt;After making this change, I received an error when Planet tried to startup:&lt;/p&gt;
&lt;pre&gt;
ERROR 2011-03-02 09:56:08,502 DatabaseProvider:errorMessage - ERROR: unable to obtain database connection. 
Likely problem: bad connection parameters or database unavailable.
FATAL 2011-03-02 09:56:08,502 RollerContext:contextInitialized - Roller Planet startup failed during app preparation
org.apache.roller.planet.business.startup.StartupException: ERROR: unable to obtain database connection. 
Likely problem: bad connection parameters or database unavailable.
&lt;/pre&gt;
&lt;p&gt;I don&apos;t remember why I enabled planet, but turning it off in roller-custom.properties seemed to solve the problem.&lt;/p&gt;
&lt;pre&gt;
planet.aggregator.enabled=false
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Password Encyrption&lt;/strong&gt;&lt;br/&gt;
The next thing I tried to do was login. When this didn&apos;t work, I figured it must be related to password encryption. With Roller 4, I had to have &quot;passwds.encryption.enabled=true&quot; in roller-custom.properties. In Roller 5, I also had to add the encryption algorithm.&lt;/p&gt;
&lt;pre&gt;
passwds.encryption.algorithm=SHA
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GZip Compression&lt;/strong&gt;&lt;br/&gt;
In November 2009, I optimized this site and used &lt;a href=&quot;http://raibledesigns.com/rd/entry/javascript_and_css_concatenation&quot;&gt;Roller&apos;s CompressionFilter and wro4j&lt;/a&gt; to gzip and concatenate JavaScript and CSS. With Roller 4, I used the CompressionFilter to compress *.css and *.js instead of using Wro4J&apos;s built-in gzip compression. The Roller 5 CompressionFilter seems to have issues with wro4j, so I had to disable it for *.css and *.js and use wro4j instead.
&lt;/p&gt;
&lt;p&gt;At this point, I figured I was good to go, so I zipped up my local WAR and scp&apos;ed it to raibledesigns.com. I stopped Tomcat and attempted to upgrade my production MySQL database (version 3.23.56). Below is the error I received.
&lt;/p&gt;
&lt;pre&gt;
$ mysql -u raible -p raible &lt; 400-to-500-migration.sql
Enter password:
ERROR 1064 (00000) at line 42: You have an error in your SQL syntax near &apos;as w set
   lastmodified = lastmodified,
   datecreated = datecreated,
   cr&apos; at line 1
&lt;/pre&gt;
&lt;p&gt;At this point, I figured my database might be slightly hosed, but since it was simply creating tables, I was probably OK. I restarted Tomcat and left the old version in place while I waited for a MySQL 5 database instance from my hosting provider, &lt;a href=&quot;http://kgbinternet.com&quot;&gt;KGB Internet&lt;/a&gt;. Once I got the new instance, I imported my backed-up database, ran the upgrade script and everything worked just peachy.&lt;/p&gt;
&lt;p&gt;I generally upgrade Roller by coping the new codebase over my old one. This is because I have a lot of symlinks and other files in my &quot;ROOT&quot; directory and like to keep those. In doing this, I found I had to do a couple things after copying everything over:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Delete WEB-INF/lib and recopy from RC4&apos;s WEB-INF/lib.&lt;/li&gt;
&lt;li&gt;Delete WEB-INF/classes and recopy from RC4&apos;s WEB-INF/classes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I then experienced some issues with JARs not being present for Roller&apos;s &lt;a href=&quot;http://wiki.java.net/bin/view/Javanet/JSPWikiPlugin&quot;&gt;JSPWikiPlugin&lt;/a&gt;. I enabled this long ago, but don&apos;t use it anymore. However, to keep old posts still working, I wanted to enable it. The downloads for the plugin seem to be gone, but luckily I found a copy and put all the JARs into my WEB-INF/lib directory.&lt;/p&gt;
&lt;p&gt;After starting Tomcat and browsing around a bit, I discovered two more issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Search doesn&apos;t seem to work. For example, there are &lt;a href=&quot;http://raibledesigns.com/rd/search?q=jQuery&quot;&gt;no results for jQuery&lt;/a&gt;.
&lt;li&gt;My &lt;a href=&quot;http://raibledesigns.com/rd/page/archives&quot;&gt;Archives&lt;/a&gt; page&apos;s calendar didn&apos;t work. It showed the following:
&lt;pre style=&quot;margin-top: 5px; margin-bottom: 0&quot;&gt;$calendarModel.showWeblogEntryCalendarBig($weblog, $cat)&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I was able to fix issue #2 by changing #showBigWeblogCalendar() to the following.
&lt;/p&gt;
&lt;pre&gt;#showWeblogEntryCalendarBig($model.weblog &quot;nil&quot;)&lt;/pre&gt;
&lt;p&gt;The first issue with search seems to remain.
&lt;/p&gt;
&lt;p&gt;If you notice any other issues on this site, please let me know. I&apos;ll try to get them fixed asap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I entered an &lt;a href=&quot;https://issues.apache.org/jira/browse/ROL-1910&quot;&gt;issue for my search problem&lt;/a&gt; in Roller&apos;s JIRA. I also managed to figure out that the problem is due to the old version of oscache that&apos;s needed by the JSPWiki plugin. Hopefully we can get the plugin upgraded to avoid this issue for other users.
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/software_quality_the_quest_for</id>
        <title type="html">Software Quality: The Quest for the Holy Grail?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/software_quality_the_quest_for"/>
        <published>2010-03-17T15:00:46-06:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="tattletale" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tssjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jboss" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ivy" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">This afternoon, I attended a &lt;a href=&quot;http://javasymposium.techtarget.com/html/tools_tech.html#JPedersenQuality&quot;&gt;session on software quality&lt;/a&gt; by &lt;a href=&quot;http://community.jboss.org/people/jesper.pedersen&quot;&gt;Jesper Pedersen&lt;/a&gt; at TSSJS. Jesper is a Core Developer at JBoss by Red Hat. He&apos;s the project lead of JBoss JCA, Tattletale, Papaki and JBoss Profiler 2. He&apos;s also currently the chairman of the Boston JBoss User Group. In this session, Jesper hopes to define basic requirements for a development environment and offer ideas on how to clean up a messy project.
&lt;/p&gt;
&lt;p&gt;
Is software quality a friend or a foe? By implementing software quality processes, are you introducing unnecessary overhead? Development platforms are &lt;em&gt;different&lt;/em&gt; today. We write a lot more business-specific code. We depend on standard frameworks for the core functionality. We depend on vendors to implement the standards correctly. We also depend on vendors to provide the necessary integration layer.
&lt;/p&gt;
&lt;p&gt;Since the platform is now a large slice of the pie, we must make sure we know where the issue is located. We must have proper integration tests; we must manage dependencies. Today, we must treat dependencies as if they are part of the application.
&lt;/p&gt;
&lt;p&gt;
Defining the platform for your project helps narrow down the dependencies for your project. The platform is composed of corporate guidelines, standards, vendors and backend systems that you have to integrate with. Documentation is key for a successful project. Key documents types: User Guide, Developer Guide, API Guide, Architect Design, Implementation and Test.
&lt;/p&gt;
&lt;p&gt;It helps to define a project-wide configuration management system. Define a code-formatting guide will add consistency in your source tree. Also make sure you have separate build, test and execution environments. Use a Maven repository for your dependencies; both to support your project&apos;s artifacts as well as vendor artifacts.&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;&quot;Maven today is an industry standard.&quot; -- Jesper Pederson
&lt;/p&gt;
&lt;p&gt;Define your tool chain as you would for your application. Back your Maven repository with SCM tools like Subversion or Git. For testing, use JUnit (unit testing), Corbertura (test coverage) and Hudson (continuous integration). Furthermore, you can add Checkstyle and Findbugs to verify coding conventions and find basic issues with code.
&lt;/p&gt;
&lt;p&gt;For the build environment, you need to make sure your dependency metadata is correct. Also, make sure you use the best practices for your given build tool. For example, with Maven and Ivy, it&apos;s a good idea to extract the version numbers into a common area of your pom.xml/build.xml so you can easily view all the versions in use. After you&apos;ve done this, you can externalize the version information from the environment. Watch out for transitive dependencies as they can be tricky. Make sure you know what gets pulled in. Use enforcers to approve/ban dependencies or turn it off (Ivy). You can also vote for &lt;a href=&quot;http://jira.codehaus.org/browse/MNG-2315&quot;&gt;MNG-2315&lt;/a&gt;. Finally, snapshot dependencies are evil: define your release process so that releases are easy.
&lt;/p&gt;
&lt;p&gt;What can you do if your project is already a mess? Signs that your project is a mess: you look at your platform as a big black box, you use different dependencies than your deployment platform or you don&apos;t have integration tests for sub-systems or dependencies. To fix this, you can use a tool to get an overview of the entire project. Enter &lt;a href=&quot;http://www.jboss.org/tattletale&quot;&gt;Tattletale&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tattletale can give you an overview of your dependencies (Ant and Maven integration). It&apos;s a static analysis tool that doesn&apos;t depend on metadata, scanning your class files instead. Using Tattletale, you can produce a number of reports about your dependencies, what they&apos;re dependent on and what&apos;s dependent on you.&lt;/p&gt;
&lt;p&gt;To maintain the lead in your project, make sure to define a checklist for each stage of your development cycle. Do reviews on documentation, architecture, component design and code. Enforce your rules of your project with your build system.&lt;/p&gt;
&lt;p&gt;Jesper&apos;s final thoughts: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maintaining dependencies for a software project can be a tricky task.&lt;/li&gt;
&lt;li&gt;Using an Open Source platform as the foundation will ease the investigation of issues and increase trust.&lt;/li&gt;
&lt;li&gt;Defining a project-wide tool chain is key.&lt;/li&gt;
&lt;li&gt;Enforce all the rules on the project (better up-front than &quot;fixing it&quot; afterwards)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As &lt;a href=&quot;http://twitter.com/dustyp/status/10637304518&quot;&gt;Dusty mentioned&lt;/a&gt;, this session has a lot of good (basic) information, but there wasn&apos;t much new stuff.  My team is using many of the technologies and practices that Jesper has mentioned. I guess that&apos;s validation that we&apos;re doing it right. I&apos;ve heard of Tattletale, but never had a need for it since I haven&apos;t been on any &quot;messy&quot; projects recently.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/my_future_of_web_frameworks</id>
        <title type="html">My Future of Web Frameworks Presentation</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/my_future_of_web_frameworks"/>
        <published>2010-02-26T08:55:39-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vegas" scheme="http://roller.apache.org/ns/tags/" />
        <category term="theserverside" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tssjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="future" scheme="http://roller.apache.org/ns/tags/" />
        <category term="presentation" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Earlier this week, I &lt;a href=&quot;http://twitter.com/mraible/status/9467279089&quot;&gt;tweeted about a history of web frameworks timeline&lt;/a&gt; I created for my upcoming &lt;a href=&quot;http://javasymposium.techtarget.com/html/frameworks.html#MRaibleFrameworks&quot;&gt;Future of Web Frameworks talk&lt;/a&gt; at &lt;a href=&quot;http://javasymposium.techtarget.com/&quot;&gt;TSSJS Vegas 2010&lt;/a&gt;. I immediately received a lot of feedback and requests for adding new frameworks and releases. The image below is the result of that Twitter conversation. Thanks to everyone who contributed.
&lt;/p&gt;
&lt;p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/4378559350/&quot; title=&quot;History of Web Frameworks&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4067/4378559350_13f0755403.jpg&quot; width=&quot;500&quot; height=&quot;239&quot; alt=&quot;History of Web Frameworks&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Back in &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_future_of_web_frameworks&quot;&gt;November&lt;/a&gt;, I wrote about my proposals for TSSJS. I&apos;ve been thinking a lot about web frameworks lately and I can&apos;t help but think we live in a very exciting time. As a Java developer, I&apos;ve been exposed to one of the most vibrant language ecosystems on the planet. As &lt;a href=&quot;http://www.javaworld.com/podcasts/jtech/2009/020909jtech-bray.html&quot;&gt;Tim Bray talks about&lt;/a&gt;, the Java Platform has 3 legs: the language, the virtual machine and a huge, immense library of APIs (both in the JDK and in open source libraries). The diagram below is something I created based on Tim&apos;s podcast.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/4388528613/&quot; title=&quot;Java has 3 Legs&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4003/4388528613_18df5e164f_o.png&quot; width=&quot;418&quot; height=&quot;290&quot; alt=&quot;Java has 3 Legs&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Tim says, &quot;One of those legs is replaceable and that&apos;s the language.&quot; And he&apos;s right, there&apos;s many &lt;a href=&quot;http://blog.thinkrelevance.com/2008/9/24/java-next-overview&quot;&gt;Java.next&lt;/a&gt; languages that run efficiently on the JVM. This is one of the most exciting parts of being a Java web developer today. There&apos;s many proven web frameworks and languages that you can pick to build your next web application. 
&lt;/p&gt;
&lt;p&gt;
The best part is many of the best web frameworks run on the JVM. Not only that, but the best code editors are the IDEs that you&apos;re familiar with and have grown to love. Furthermore, much of the literature for Java.next languages is written &lt;em&gt;for&lt;/em&gt; Java developers. As someone who knows Java, you have wealth of web frameworks and languages just waiting for you to learn them. &lt;!--I think the biggest mistake you can make as developer is to stop learning. Just because you know one language/framework well doesn&apos;t mean you shouldn&apos;t learn about it&apos;s competition. Java vs. Scala, Maven vs. Ant, Rails vs. Grails, GWT vs. Flex, Tomcat vs. Jetty, Spring vs. Guice, Hibernate vs. iBATIS - your knowledge about more than one language/framework can be very rewarding.--&gt;
&lt;/p&gt;
&lt;p&gt;
To create my presentation on the future of web frameworks, I followed the outline I &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_future_of_web_frameworks&quot;&gt;posted previously&lt;/a&gt;. I plan on explaining the evolution and history of web frameworks and how we got to where we are today. From there, I&apos;ll be speculating on what web applications we&apos;ll be developing in the future. Finally, I&apos;ll touch on the necessary features of web frameworks that will allow us to develop these applications. 
&lt;/p&gt;
&lt;p&gt;
Of course, I haven&apos;t actually presented this talk yet, so it&apos;s likely to change in the coming weeks before the conference. The good news is this gives you the opportunity to provide constructive criticism on this presentation and help make it better. I realize that a presentation rarely represents the conversation that takes place during a conference. However, I believe it can portray the jist of my thinking and lead to a meaningful conversation in the comments of this post.
Below is the presentation I created - thanks in advance for any feedback. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=thefutureofwebframeworks-100225012146-phpapp02&amp;rel=0&amp;stripped_title=the-future-of-web-frameworks&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;//static.slidesharecdn.com/swf/ssplayer2.swf?doc=thefutureofwebframeworks-100225012146-phpapp02&amp;rel=0&amp;stripped_title=the-future-of-web-frameworks&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;
For those who will be joining me at TSSJS ... it&apos;s gonna be a great show. St. Patrick&apos;s Day in Vegas, what more could you ask for? &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; This article has been &lt;a href=&quot;http://java.dzone.com/articles/my-future-web-frameworks&quot;&gt;re-posted on Javalobby&lt;/a&gt; and contains additional community feedback in the comments.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/what_s_your_preferred_development</id>
        <title type="html">What&apos;s your preferred development infrastructure stack?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/what_s_your_preferred_development"/>
        <published>2010-01-12T21:54:46-07:00</published>
        <updated>2010-01-13T05:04:47-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="chordiant" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jivesoftware" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bamboo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="cvs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="cruisecontrol" scheme="http://roller.apache.org/ns/tags/" />
        <category term="viewvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jirastudio" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hudson" scheme="http://roller.apache.org/ns/tags/" />
        <category term="trac" scheme="http://roller.apache.org/ns/tags/" />
        <category term="mediawiki" scheme="http://roller.apache.org/ns/tags/" />
        <category term="subversion" scheme="http://roller.apache.org/ns/tags/" />
        <category term="sventon" scheme="http://roller.apache.org/ns/tags/" />
        <category term="fisheye" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bugzilla" scheme="http://roller.apache.org/ns/tags/" />
        <category term="atlassian" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jivesbs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jira" scheme="http://roller.apache.org/ns/tags/" />
        <category term="clearspace" scheme="http://roller.apache.org/ns/tags/" />
        <category term="starteam" scheme="http://roller.apache.org/ns/tags/" />
        <category term="confluence" scheme="http://roller.apache.org/ns/tags/" />
        <category term="git" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jspwiki" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Over the years, I&apos;ve used many different source control systems, wikis, bug trackers and continuous integration servers. On many projects, I&apos;ve been responsible for recommending and helping to install these systems. For the most part, they&apos;ve often been disparate, meaning there wasn&apos;t a whole lot of integration between the various applications. Here&apos;s a list of all the different systems I&apos;ve used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Source Control Systems
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.nongnu.org/cvs/&quot;&gt;CVS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.borland.com/us/products/starteam/index.html&quot;&gt;StarTeam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://subversion.apache.org/&quot;&gt;Subversion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Source Viewers
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.atlassian.com/software/fisheye/&quot;&gt;FishEye&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sventon.org/&quot;&gt;Sventon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://trac.edgewall.org/&quot;&gt;Trac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.viewvc.org/&quot;&gt;ViewVC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Wikis
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.atlassian.com/software/confluence/&quot;&gt;Confluence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mediawiki.org/wiki/MediaWiki&quot;&gt;MediaWiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.jspwiki.org/&quot;&gt;JSPWiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://trac.edgewall.org/&quot;&gt;Trac&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug Trackers
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bugzilla.org/&quot;&gt;Bugzilla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.atlassian.com/software/jira/&quot;&gt;JIRA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.borland.com/us/products/starteam/index.html&quot;&gt;StarTeam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://trac.edgewall.org/&quot;&gt;Trac&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Continuous Integration Servers
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.atlassian.com/software/bamboo/&quot;&gt;Bamboo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://continuum.apache.org/&quot;&gt;Continuum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cruisecontrol.sourceforge.net/&quot;&gt;CruiseControl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hudson.dev.java.net/&quot;&gt;Hudson&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mailing Lists / Forums
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;
&lt;li&gt;A private &lt;a href=&quot;http://groups.google.com&quot;&gt;Google Group&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.jivesoftware.com/beyond/forums&quot;&gt;Jive Forums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.gnu.org/software/mailman/index.html&quot;&gt;Mailman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I believe all of these applications are useful in supporting an efficient development process. When clients have asked me to help them build this type of infrastructure, I&apos;ve often asked if they wanted to pay for it or not. If not, I&apos;d recommend Trac (since it has a wiki, source viewer and bug tracker all-in-one) and Hudson. If they were willing to pay, I&apos;d recommend the Atlassian Suite (Confluence, JIRA and Bamboo). 
&lt;/p&gt;
&lt;p&gt;These stacks all seem to work &lt;em&gt;pretty well&lt;/em&gt; and the Atlassian Suite certainly works great for &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; and other open source projects. However, I recently had the pleasure of working at &lt;a href=&quot;http://chordiant.com&quot;&gt;Chordiant Software&lt;/a&gt; where we used &lt;a href=&quot;http://www.chordiant.com/cx/mesh.html&quot;&gt;Chordiant Mesh&lt;/a&gt; to collaborate and develop software. Their Mesh system is powered by &lt;a href=&quot;http://www.jivesoftware.com/beyond/clearspace&quot;&gt;Jive  Clearspace&lt;/a&gt; and provides a wealth of tools for each project, including a dashboard, discussions, documents, notifications and widgets providing status + links to JIRA and Bamboo. 
&lt;/p&gt;
&lt;p&gt;
Even though Clearspace&apos;s rich text editor caused me some early frustration, I really enjoyed the fact that a solid development infrastructure existed. It made it much easier to collaborate, document and execute our development process. I realize that it&apos;s difficult to build and maintain a custom development infrastructure stack. Chordiant had a whole team that developed, enhanced and supported their environment. But that doesn&apos;t mean it&apos;s impossible and not worth striving for. 
&lt;/p&gt;
&lt;p&gt;
I think there&apos;s a number of best-of-breed applications you can use to build a sweet development infrastructure stack. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Source Control: &lt;strong&gt;Git&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Source Viewer: &lt;strong&gt;FishEye&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Wiki: &lt;strong&gt;Jive SBS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Bug Tracker: &lt;strong&gt;JIRA&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Continuous Integration: &lt;strong&gt;Hudson&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;ve only used Git for a few weeks, but I can easily tell it&apos;s better than Subversion. I don&apos;t think it&apos;s easy to convince companies to switch their source control system, so it&apos;s probably not worth arguing if you&apos;re already using Subversion. I can also envision using Confluence instead of Jive SBS, but then you lose forum support and have to use something like Mailman or Google Groups. &lt;a href=&quot;http://www.atlassian.com/studio/&quot;&gt;JIRA Studio&lt;/a&gt; looks close to my dream stack, except it doesn&apos;t support Git or a forum + mailing list system.&lt;/p&gt;
&lt;p&gt;
What is your preferred development infrastructure stack? Why?</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/a_letter_to_the_appfuse</id>
        <title type="html">A Letter to the AppFuse Community</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/a_letter_to_the_appfuse"/>
        <published>2009-11-04T00:17:17-07:00</published>
        <updated>2009-11-04T07:32:42-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="seam" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rubyonrails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="letter" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springroo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="play" scheme="http://roller.apache.org/ns/tags/" />
        <category term="community" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">The last &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; release was way back in &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_0_2_released&quot;&gt;May 2008&lt;/a&gt;. Many folks have asked when the next release would be ever since. Often, I&apos;ve said &quot;sometimes this quarter&quot;, but obviously, that&apos;s never happened. For that, I apologize.
&lt;/p&gt;
&lt;p&gt;There are many reasons I haven&apos;t worked on AppFuse for the past 18 months, but it mostly comes down to the fact that I didn&apos;t make time for it. The good news is I&apos;m working on it again and &lt;em&gt;will&lt;/em&gt; have a release out sometime this month. Unfortunately, it probably won&apos;t be a 2.1 final release, but there&apos;s so many things that&apos;ve changed, I feel like a milestone release is a good idea. Here&apos;s a brief summary of changes so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changed archetypes to include all source and tests for the &quot;webapp&quot; portion of the application. No more warpath plugin, merging wars and IDE issues. Using &quot;mvn jetty:run&quot; should work as expected.&lt;/li&gt;
&lt;li&gt;Moved from &lt;a href=&quot;http://raibledesigns.com/rd/entry/moving_from_spring_s_xml&quot;&gt;Spring XML to Annotations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;AppFuse Light &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven&quot;&gt;converted to Maven modules&lt;/a&gt; and now depends on AppFuse&apos;s backend.&lt;/li&gt;
&lt;li&gt;Published easier to use archetype selection form in the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Published &lt;a href=&quot;http://static.appfuse.org/light/archetypes.html&quot;&gt;archetype selection form for AppFuse Light&lt;/a&gt;. I do plan on combining these forms as soon as I figure out the best UI and instructions for users to choose AppFuse or AppFuse Light.&lt;/li&gt;
&lt;li&gt;Upgraded all libraries to latest released versions (Spring 3 hasn&apos;t had a final release yet).&lt;/li&gt;
&lt;li&gt;Upgraded to Tapestry 5 thanks to &lt;a href=&quot;http://code.google.com/p/tapestry5-appfuse/&quot;&gt;Serge Eby&lt;/a&gt;. I still need to complete tests and code generation for tests.&lt;/li&gt;
&lt;li&gt;Added &lt;a href=&quot;http://issues.appfuse.org/browse/APF-267&quot;&gt;Compass support&lt;/a&gt; thanks to a patch from &lt;a href=&quot;http://www.kimchy.org/&quot;&gt;Shay Banon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Upgraded from &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1125&quot;&gt;XFire to CXF&lt;/a&gt; for Web Services.&lt;/li&gt;
&lt;li&gt;Moved Maven repository to &lt;a href=&quot;https://docs.sonatype.com/display/NX/OSS+Repository+Hosting&quot;&gt;Sonatype&apos;s OSS Repository Hosting&lt;/a&gt; for snapshots and releasing to Maven Central. There are no longer any AppFuse-specific artifacts, all are available in central.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I realize there&apos;s many full-stack frameworks that do the same thing as AppFuse with less code. Examples include &lt;a href=&quot;http://rubyonrails.org&quot;&gt;Ruby on Rails&lt;/a&gt;, &lt;a href=&quot;http://grails.org&quot;&gt;Grails&lt;/a&gt;, &lt;a href=&quot;http://seamframework.org&quot;&gt;Seam&lt;/a&gt;, &lt;a href=&quot;http://www.springsource.org/roo&quot;&gt;Spring Roo&lt;/a&gt; and the &lt;a href=&quot;http://www.playframework.org/&quot;&gt;Play framework&lt;/a&gt;. However, there seems to be quite a few folks that continue to use AppFuse and it stills serves the community as a nice example of how to integrate frameworks. Furthermore, it helps me keep up with the latest framework releases, their quirks and issues that happen when you try to integrate them. In short, working on it helps me stay up to speed with Java open source frameworks.
&lt;/p&gt;
&lt;p&gt;
For those folks that like the 1.x, Ant-based version of AppFuse, there will &lt;em&gt;not&lt;/em&gt; be a 1.9.5 release. I know I promised it for years, but it&apos;s simply something I will not use, so I&apos;d rather not invest my time in it. I&apos;m sorry for lying to those that expected it.&lt;/p&gt;
&lt;p&gt;So what&apos;s the future of AppFuse? Will it continue to integrate web frameworks with Spring and popular persistence frameworks? Possibly, but it seems more logical to align it with the types of Ajax + REST applications I&apos;m creating these days. I&apos;m currently thinking AppFuse 3.0 would be nice as a RESTful backend with GWT and Flex UIs. I might create the backend with &lt;a href=&quot;http://cxf.apache.org/&quot;&gt;CXF&lt;/a&gt;, but it&apos;s possible I&apos;d use one of the frameworks mentioned above and simply leverage it to create the default features AppFuse users have come to expect.&lt;/p&gt;
&lt;p&gt;More than anything, I&apos;m writing this letter to let you know that the AppFuse project is not dead and you can expect a release in the near future.&lt;/p&gt;
&lt;p&gt;Thanks for your support,&lt;/p&gt;
&lt;p&gt;Matt</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/running_hosted_mode_in_gwt</id>
        <title type="html">Running Hosted Mode in GWT Libraries (when using Maven)</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/running_hosted_mode_in_gwt"/>
        <published>2009-11-03T09:37:07-07:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="hostedmode" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="resources" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt-maven-plugin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ant" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven-gwt-plugin" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Earlier this year, I wrote about &lt;a href=&quot;http://raibledesigns.com/rd/entry/modularizing_gwt_applications_with_gwt&quot;&gt;Modularizing GWT Applications with GWT-Maven&lt;/a&gt;. Fast forward 8 months and I&apos;m still working with GWT and using this same technique. However, this time I&apos;m working with the &lt;a href=&quot;http://mojo.codehaus.org/gwt-maven-plugin/&quot;&gt;Maven GWT Plugin&lt;/a&gt; from Codehaus. In my last post, I wrote:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
The results of modularizing your application are beneficial (shared code) and detrimental (you have to &lt;code&gt;mvn install&lt;/code&gt; gwt-core whenever you make changes in shared classes). If you know of a way to configure the gwt-maven plugin to read sources from both gwt-core and gwt-webapp in hosted mode, I&apos;d love to hear about it. 
&lt;/p&gt;
&lt;p&gt;The good news is I found a solution for this, using the &lt;a href=&quot;http://mojo.codehaus.org/build-helper-maven-plugin/&quot;&gt;Builder Helper Maven Plugin&lt;/a&gt;. The GWT Maven Plugin&apos;s &lt;a href=&quot;http://mojo.codehaus.org/gwt-maven-plugin/user-guide/productivity.html&quot;&gt;
Productivity tip for multi-project setup&lt;/a&gt; has more information on how to configure this (note: we use IntelliJ and Eclipse on my project and did not need to configure this in a profile).&lt;/p&gt;
&lt;p&gt;
All was fine and dandy with this configuration until I wanted to be able to run hosted mode to develop/test everything in my library before including it in my main project. Luckily, you can still run &lt;strong&gt;mvn gwt:run&lt;/strong&gt; on a JAR project. However, when you configure your pom.xml so sources are included in your JAR, you run into an issue: your *.java files will be copied to &lt;em&gt;war/WEB-INF/classes&lt;/em&gt; and hosted mode will use these files as source rather than the ones you&apos;re editing in &lt;em&gt;src/main/java&lt;/em&gt;. 
&lt;/p&gt;
&lt;p&gt;To solve this, I changed my pom.xml to do two things:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Only copy resources right before packaging (in the test phase).&lt;/li&gt;
&lt;li&gt;When packaging is complete, delete the *.java files from &lt;em&gt;war/WEB-INF/classes&lt;/em&gt; (using Ant).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below is the XML I used to make this possible. Please let me know if you have a way to simplify this configuration.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-resources-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.4.1&amp;lt;/version&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;phase&amp;gt;test&amp;lt;/phase&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;copy-resources&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;outputDirectory&amp;gt;${project.build.outputDirectory}&amp;lt;/outputDirectory&amp;gt;
                &amp;lt;resources&amp;gt;
                    &amp;lt;resource&amp;gt;
                        &amp;lt;directory&amp;gt;src/main/java&amp;lt;/directory&amp;gt;
                    &amp;lt;/resource&amp;gt;
                    &amp;lt;resource&amp;gt;
                        &amp;lt;directory&amp;gt;src/main/resources&amp;lt;/directory&amp;gt;
                    &amp;lt;/resource&amp;gt;
                &amp;lt;/resources&amp;gt;
            &amp;lt;/configuration&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-antrun-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.3&amp;lt;/version&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;run&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;tasks&amp;gt;
                    &amp;lt;delete&amp;gt;
                        &amp;lt;fileset dir=&quot;${project.build.outputDirectory}&quot; includes=&quot;**/*.java&quot;/&amp;gt;
                    &amp;lt;/delete&amp;gt;
                &amp;lt;/tasks&amp;gt;
            &amp;lt;/configuration&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This solution seems to work pretty well. As far as developing your library in hosted mode, you&apos;ll need to configure two *.gwt.xml files, one that doesn&apos;t have an &amp;lt;entry-point&amp;gt; defined and one that does. Configure the one with the entry point as the &amp;lt;module&amp;gt; in your gwt-maven-plugin configuration.&lt;/p&gt;
&lt;p&gt;As a side note, I found a few issues with the 1.1 version of the &lt;a href=&quot;http://mojo.codehaus.org/gwt-maven-plugin/user-guide/archetype.html&quot;&gt;Maven GWT Archetype&lt;/a&gt;. Below are the steps I used to fix these issues and upgrade to GWT 1.7.0 (I realize 1.7.1 is out, but gwt-dev-1.7.1-mac.jar &lt;a href=&quot;http://repo2.maven.org/maven2/com/google/gwt/gwt-dev/1.7.1/&quot;&gt;doesn&apos;t exist in Maven central&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;First, create a new project by running the following from the command line:

&lt;pre&gt;
mvn archetype:generate \
  -DarchetypeGroupId=org.codehaus.mojo \
  -DarchetypeArtifactId=gwt-maven-plugin \
  -DarchetypeVersion=1.1 \
  -DgroupId=com.yourcompany \
  -DartifactId=gwt-project -Dversion=1.0-SNAPSHOT -B
&lt;/pre&gt;
&lt;p&gt;
After creating the project, you&apos;ll need to modify the pom.xml as follows:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Change the gwt-maven-plugin&apos;s version to &lt;strong&gt;1.1&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Change the ${gwtVersion} property to &lt;strong&gt;1.7.0&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;&amp;lt;runTarget&gt;Application.html&amp;lt;/runTarget&gt;&lt;/code&gt; to the &amp;lt;configuration&amp;gt; element of the plugin.&lt;/li&gt;
&lt;li&gt;Move Application.html and web.xml so they&apos;re under the &quot;war&quot; directory.&lt;/li&gt;
&lt;li&gt;Update Application.html to prepend the GWT module name in the &amp;lt;script&amp;gt; tag.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I hope these instructions help you create modular GWT projects with Maven. This setup is working great on my current project.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/how_to_use_gwt_2</id>
        <title type="html">How to use GWT 2.0 with Maven and Generate SOYC Reports</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/how_to_use_gwt_2"/>
        <published>2009-06-25T23:45:04-06:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="gwt-maven-plugin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="runasync" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="soyc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">One of the most interesting features coming in GWT 2.0 is &lt;a href=&quot;http://code.google.com/p/google-web-toolkit/wiki/CodeSplitting&quot;&gt;code splitting&lt;/a&gt; and the ability to use GWT.runAsync() to reduce the size of your application&apos;s initial download. This week, I learned how to use GWT 2.0 with my GWT 1.6/Maven project. Below are instructions on how to build and use the latest GWT with Maven.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/webtoolkit/makinggwtbetter.html#compiling&quot;&gt;Checkout GWT and setup GWT_TOOLS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Set a GWT_VERSION environment variable to &lt;em&gt;2.0.0-SNAPSHOT&lt;/em&gt; (export GWT_VERSION=2.0.0-SNAPSHOT).&lt;/li&gt;
&lt;li&gt;Build GWT with the &lt;em&gt;ant&lt;/em&gt; command.&lt;/li&gt;
&lt;li&gt;After building completes, install the GWT artifacts into your local Maven repository using the following commands: 
&lt;pre style=&quot;margin-top: 5px&quot;&gt;mvn install:install-file -DgroupId=com.google.gwt \
-DartifactId=gwt-user -Dversion=2.0.0-SNAPSHOT \
-Dpackaging=jar -Dfile=build/lib/gwt-user.jar

mvn install:install-file -DgroupId=com.google.gwt \
-DartifactId=gwt-servlet -Dversion=2.0.0-SNAPSHOT \
-Dpackaging=jar -Dfile=build/lib/gwt-servlet.jar

mvn install:install-file -DgroupId=com.google.gwt \
-DartifactId=gwt-dev -Dversion=2.0.0-SNAPSHOT \
-Dclassifier=mac -Dpackaging=jar -Dfile=build/lib/gwt-dev-mac.jar

mkdir temp
tar -zxf build/dist/gwt-mac-2.0.0-SNAPSHOT.tar.gz -C temp
cd temp/gwt-mac-2.0.0-SNAPSHOT
zip -0 gwt-mac-2.0.0-SNAPSHOT.zip lib*.jnilib
cd ../..

mvn install:install-file -DgroupId=com.google.gwt \
-DartifactId=gwt-dev -Dversion=2.0.0-SNAPSHOT \
-Dclassifier=mac-libs -Dpackaging=zip \
-Dfile=temp/gwt-mac-2.0.0-SNAPSHOT/gwt-mac-2.0.0-SNAPSHOT.zip
&lt;/pre&gt;
&lt;div style=&quot;margin-bottom: 5px; text-align: right&quot;&gt;&lt;em&gt;Thanks to &lt;a href=&quot;http://groups.google.com/group/codehaus-mojo-gwt-maven-plugin-users/browse_thread/thread/83e860b1de4565f5&quot;&gt;Jason&lt;/a&gt; for his help with this script.&lt;/em&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Modify the pom.xml of your GWT project to use the the &lt;a href=&quot;http://mojo.codehaus.org/gwt-maven-plugin/&quot;&gt;gwt-maven-plugin&lt;/a&gt; from Codehaus. Of course, you&apos;ll need to modify the &amp;lt;runTarget&amp;gt; to fit your project.
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;gwt-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.1&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;runTarget&amp;gt;org.appfuse.gwt.mvc.${entry.point}/${entry.point}.html&amp;lt;/runTarget&amp;gt;
    &amp;lt;/configuration&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;
                &amp;lt;goal&amp;gt;test&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Modify your dependencies to match the ones below. With the Codehaus plugin, dependencies are much more concise.
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.google.gwt&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;gwt-servlet&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${gwt.version}&amp;lt;/version&amp;gt;
    &amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.google.gwt&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;gwt-user&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${gwt.version}&amp;lt;/version&amp;gt;
    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Add &lt;em&gt;&amp;lt;gwt.version&gt;2.0.0-SNAPSHOT&amp;lt;/gwt.version&gt;&lt;/em&gt; to the properties section of your pom.xml.&lt;/li&gt;
&lt;li&gt;At this point, you should be able to compile your project with &lt;strong&gt;mvn gwt:compile&lt;/strong&gt; and run it in hosted mode using &lt;strong&gt;mvn gwt:run&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Generate SOYC Reports&lt;/strong&gt;&lt;br/&gt;
In Google&apos;s code splitting documentation, it mentions &lt;a href=&quot;http://code.google.com/p/google-web-toolkit/wiki/CodeSplitting#The_Story_of_Your_Compile_(SOYC)&quot;&gt;The Story of Your Compile (SOYC)&lt;/a&gt;. From the documentation:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
To obtain a SOYC report for your application, there are two steps necessary. First, add -soyc to the compilation options that are passed to the GWT compiler. This will cause the compiler to emit raw information about the compile to XML files in an -aux directory beside the rest of the compiled output. In that directory, you will see an XML file for each permutation and a manifest.xml file that describes the contents of all the others.
&lt;br/&gt;&lt;br/&gt;
The second step is to convert that raw information into viewable HTML. This is done with the SoycDashboard tool.
&lt;/p&gt;
&lt;p&gt;The first step is not currently possible with the gwt-maven-plugin, so I &lt;a href=&quot;http://jira.codehaus.org/browse/MGWT-92&quot;&gt;created a patch for it&lt;/a&gt;. 
&lt;/p&gt;
&lt;p style=&quot;margin-left: 20px; color: #666&quot;&gt;&lt;em&gt;
If you patch the gwt-maven-plugin and install it locally, make sure and change the version in your pom.xml to &lt;strong&gt;1.2-SNAPSHOT&lt;/strong&gt;.
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To use the SoycDashboard tool, you&apos;ll need to install the gwt-soyc-vis.jar.
&lt;pre&gt;
mvn install:install-file -DgroupId=com.google.gwt \
-DartifactId=gwt-soyc-vis -Dversion=2.0.0-SNAPSHOT \
-Dpackaging=jar -Dfile=build/lib/gwt-soyc-vis.jar
&lt;/pre&gt;
&lt;p&gt;Now you can generate SOYC reports with &lt;strong&gt;mvn gwt:compile -Dgwt.compiler.soyc=true&lt;/strong&gt;. You can also add &amp;lt;soyc&amp;gt;true&amp;lt;/soyc&amp;gt; to the &amp;lt;configuration&amp;gt; section of the gwt-maven-plugin.&lt;/p&gt;
&lt;p&gt;The second step (converting the raw information into viewable HTML) is possible using &lt;em&gt;java&lt;/em&gt; from the command-line, or by using the &lt;a href=&quot;http://mojo.codehaus.org/exec-maven-plugin/&quot;&gt;exec-maven-plugin&lt;/a&gt;. Here&apos;s the (lengthy) command-line version:&lt;/p&gt;
&lt;pre&gt;java -Xmx1024m -cp /Users/mraible/.m2/repository/com/google/gwt/gwt-soyc/2.0.0-SNAPSHOT/gwt-soyc-2.0.0-SNAPSHOT.jar:/Users/mraible/.m2/repository/com/google/gwt/gwt-dev/2.0.0-SNAPSHOT/gwt-dev-2.0.0-SNAPSHOT-mac.jar com.google.gwt.soyc.SoycDashboard -resources ~/.m2/repository/com/google/gwt/gwt-soyc/2.0.0-SNAPSHOT/gwt-soyc-2.0.0-SNAPSHOT.jar -out target/soyc-report target/extra/org.appfuse.gwt.mvc.MVC/soycReport/stories0.xml.gz target/extra/org.appfuse.gwt.mvc.MVC/soycReport/dependencies0.xml.gz target/extra/org.appfuse.gwt.mvc.MVC/soycReport/splitPoints0.xml.gz&lt;/pre&gt;
&lt;p&gt;In this example, I&apos;m using the files from &lt;em&gt;stories0.xml.gz&lt;/em&gt;, &lt;em&gt;dependencies0.xml.gz&lt;/em&gt;, &lt;em&gt;splitPoints0.xml.gz&lt;/em&gt;. In the &lt;em&gt;soycReport&lt;/em&gt; output directory, there&apos;s 5 of each these files and I&apos;m not sure what the difference between reports is. Hopefully someone on the GWT team can elaborate. The exec-maven-plugin version is as follows:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;exec-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.1&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;executable&amp;gt;java&amp;lt;/executable&amp;gt;
        &amp;lt;arguments&amp;gt;
            &amp;lt;argument&amp;gt;-cp&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;
                ${settings.localRepository}/com/google/gwt/gwt-soyc/2.0.0-SNAPSHOT/gwt-soyc-2.0.0-SNAPSHOT.jar:${settings.localRepository}/com/google/gwt/gwt-dev/2.0.0-SNAPSHOT/gwt-dev-2.0.0-SNAPSHOT-${platform}.jar
            &amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;com.google.gwt.soyc.SoycDashboard&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;-out&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;target/soyc-report&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;-resources&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;
                ${settings.localRepository}/com/google/gwt/gwt-soyc/2.0.0-SNAPSHOT/gwt-soyc-2.0.0-SNAPSHOT.jar
            &amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;${project.build.directory}/extra/org.appfuse.gwt.mvc.MVC/soycReport/stories0.xml.gz&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;${project.build.directory}/extra/org.appfuse.gwt.mvc.MVC/soycReport/dependencies0.xml.gz&amp;lt;/argument&amp;gt;
            &amp;lt;argument&amp;gt;${project.build.directory}/extra/org.appfuse.gwt.mvc.MVC/soycReport/splitPoints0.xml.gz&amp;lt;/argument&amp;gt;
        &amp;lt;/arguments&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;After configuring this plugin in your project, you should be able to run &lt;strong&gt;mvn gwt:compile exec:exec&lt;/strong&gt; and open the generated report (at &lt;em&gt;target/soyc-report/SoycDashboard-index.html&lt;/em&gt;). Currently, there doesn&apos;t seem to be much documentation on SOYC. &lt;a href=&quot;http://www.slideshare.net/fredsa/gwt-overview-and-feature-preview-sv-web-jug-june-16-2009&quot;&gt;Fred Sauer&apos;s recent presentation&lt;/a&gt; talks a bit about SOYC and GWT.runAsync(), but that&apos;s about it.&lt;/p&gt;
&lt;p&gt;To figure out how to use GWT 2.0 with Maven, I used my &lt;a href=&quot;http://raibledesigns.com/rd/entry/gxt_s_mvc_framework&quot;&gt;GWT MVC Example&lt;/a&gt; project. The first SOYC report I generated said the initial download was 108,967 KB. To integrate GWT.runAsync(), I modified all the project&apos;s controllers so their &lt;em&gt;handleEvent()&lt;/em&gt; methods changed from this:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public void handleEvent(AppEvent&lt;?&gt; event) {
    onViewHome(event);
}
&lt;/pre&gt;
&lt;p&gt;To this:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public void handleEvent(final AppEvent&lt;?&gt; event) {
    GWT.runAsync(new RunAsyncCallback() {
        public void onFailure(Throwable throwable) {
            Window.alert(throwable.getMessage());
        }

        public void onSuccess() {
            onViewHome(event);
        }
    });
}

&lt;/pre&gt;&lt;p&gt;When I generated a new SOYC report, the initial download size was reduced to 56,718 KB. Furthermore, I was able to see that my &quot;Leftovers code&quot; consisted of 63,175 KB. I&apos;m sure there&apos;s better ways to split my project using GWT.runAsync(), but I&apos;m happy to see I was able to reduce the initial download by 50%. &lt;/p&gt;
&lt;p&gt;If you&apos;d like to try GWT 2.0, you can can &lt;a href=&quot;http://static.raibledesigns.com/downloads/gwt-mvc-1.1.zip&quot;&gt;download my gwt-mvc example project&lt;/a&gt;. To build/run this project, you&apos;ll need to 1) build and install GWT, 2) patch gwt-maven-plugin and 3) run &lt;strong&gt;mvn gwt:compile exec:exec&lt;/strong&gt; to generate the SOYC report. In an ideal world, the gwt-maven-plugin can be enhanced to generate the SOYC report (rather than using the exec-maven-plugin). In the meantime, I think it&apos;s pretty cool that you can try out GWT 2.0 features while they&apos;re still being developed.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/testing_gwt_applications</id>
        <title type="html">Testing GWT Applications</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/testing_gwt_applications"/>
        <published>2009-02-09T15:27:36-07:00</published>
        <updated>2009-02-09T22:29:35-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="codecoverage" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwttestcase" scheme="http://roller.apache.org/ns/tags/" />
        <category term="idea" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="extjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="eclipse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="emma" scheme="http://roller.apache.org/ns/tags/" />
        <category term="testing" scheme="http://roller.apache.org/ns/tags/" />
        <category term="junit" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gxt" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last week, I did some research on GWT, how to test it and code coverage options for tests that extend &lt;a href=&quot;http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/junit/client/GWTTestCase.html&quot;&gt;GWTTestCase&lt;/a&gt;. The reason I did this is because I&apos;ve found that most of the GWT tests I write have to extend GWTTestCase and I&apos;d like to have code coverage reports. Read below for more information on my findings for testing GWT classes.
&lt;/p&gt;
&lt;p&gt;There are quite a few articles about testing GWT applications. Here are a few samples:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://blog.danielwellman.com/2008/11/test-first-gwt-article-in-november-2008-better-software-magazine.html&quot;&gt;Test-First GWT&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://robvanmaris.jteam.nl/2008/03/09/test-driven-development-for-gwt-ui-code/&quot;&gt;Test driven development for GWT UI code&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://robvanmaris.jteam.nl/2008/04/22/test-driven-development-for-gwt-ui-code-with-asynchronous-rpc/&quot;&gt;Test driven development for GWT UI code with asynchronous RPC&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://blog.springsource.com/2008/02/19/enabling-test-driven-development-in-gwt-client-code/&quot;&gt;Enabling Test Driven Development in GWT client code&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/10f8b38455e4102a&quot;&gt;JUnit tests for widgets&lt;/a&gt; - thread about which components to test.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main gist of these articles is that you should structure your code to make the core functionality of your application testable without having to depend on GWTTestCase.&lt;/p&gt;

&lt;p&gt;All of them also advocate using an MVC or MVP (Model View Presenter) pattern. Currently, I&apos;m using &lt;a href=&quot;http://extjs.com/products/gxt/&quot;&gt;GXT&lt;/a&gt; and its MVC Framework. Unfortunately, GXT&apos;s MVC &lt;a href=&quot;http://extjs.net/forum/showthread.php?t=55064&quot;&gt;doesn&apos;t have much documentation&lt;/a&gt;. The good news is there is a &lt;a href=&quot;http://christianposta.com/blog/?p=6&quot;&gt;good article&lt;/a&gt; that explained enough that I was able to refactor my project to use it.&lt;/p&gt;

&lt;p&gt;The unfortunate side of this refactoring was I discovered that classes that extend GXT&apos;s MVC Framework &lt;a href=&quot;http://extjs.net/forum/showthread.php?t=58837&quot;&gt;have to be tested with GWTTestCase&lt;/a&gt;. The downside to extending GWTTestCase is there is it&apos;s difficult to create code coverage reports.&lt;/p&gt;

&lt;p&gt;GWT&apos;s &lt;a href=&quot;http://code.google.com/p/google-web-toolkit/issues/detail?id=779&quot;&gt;issue 799&lt;/a&gt; has some patches that should make code coverage possible. I tried to implement code coverage with Eclipse and &lt;a href=&quot;http://www.eclemma.org/&quot;&gt;EclEmma&lt;/a&gt; using &lt;a href=&quot;http://code.google.com/p/google-web-toolkit/source/browse/tools/redist/emma/README.txt&quot;&gt;this README&lt;/a&gt;, but failed. In the process, I discovered &lt;a href=&quot;http://tinyurl.com/al8rke&quot;&gt;an issue with Eclipse 3.4 and JUnit on OS X&lt;/a&gt;. Reverting to Eclipse 3.3 solved this problem, but I was &lt;a href=&quot;http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/c05d331decd2405e/94d738c3134efb30?#94d738c3134efb30&quot;&gt;still unable to make EclEmma work with GWT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After failing with Eclipse, I tried to use the emma-maven-plugin. I was also unable to get this to work, with my findings documented in &lt;a href=&quot;http://groups.google.com/group/gwt-maven/browse_thread/thread/de736df5c99a58e6&quot;&gt;this thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, I did have some luck with getting IDEA&apos;s built-in code coverage feature working. However, after getting it to work once, it failed to work for the rest of the day and I haven&apos;t had success since.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Code Coverage and GWT&lt;/b&gt;&lt;br&gt;
Because of these issues with GWT 1.5 and code coverage, I think I&apos;ll wait until GWT 1.6 to worry about it. The good news is &lt;a href=&quot;http://www.ongwt.com/post/2009/02/07/GWT-16-M1&quot;&gt;1.6 M1 was released last Friday&lt;/a&gt;. If continuing to use GWTTestCase becomes an issue, I may write my own MVC Framework that doesn&apos;t use classes that call native JavaScript. Hopefully GXT MVC&apos;s framework will provide a good example.&lt;/p&gt;

&lt;p&gt;In addition to trying to get code coverage working, I used the internets to figure out how run GWT tests inside of Eclipse and IDEA. I don&apos;t remember the resources I used, but hopefully this up-to-date documentation will help others. The nice thing about using an IDE to run these tests is they typically execute much faster.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Running GWT Tests in Eclipse&lt;/strong&gt;&lt;br/&gt;
You should be able to run most of your GWT tests from within Eclipse using the following steps.
&lt;ol&gt;
&lt;li&gt;Right-click on a test that extends GWTTestCase and go to &lt;strong&gt;Run As&lt;/strong&gt; &gt; &lt;strong&gt;JUnit Test&lt;/strong&gt;. It&apos;s likely you will see the error message below.
&lt;pre style=&quot;color: red; margin-top: 5px&quot;&gt;Invalid launch configuration: -XstartOnFirstThread not specified.

On Mac OS X, GWT requires that the Java virtual machine be invoked with the
-XstartOnFirstThread VM argument.

Example:
  java -XstartOnFirstThread -cp gwt-dev-mac.jar com.google.gwt.dev.GWTShell
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
To fix this error, go to &lt;strong&gt;Run&lt;/strong&gt; &gt; &lt;strong&gt;Open Run Dialog&lt;/strong&gt;. Click on the &lt;strong&gt;Arguments&lt;/strong&gt; tab and add the following values. The 2nd value is to increase the amount of memory available to the test and avoid an OOM error.
&lt;pre style=&quot;margin-top: 5px&quot;&gt;-XstartOnFirstThread -Xmx512M&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;When you re-run the test, you will probably see the following error:
&lt;pre style=&quot;margin-top: 5px&quot;&gt;com.google.gwt.junit.JUnitFatalLaunchException: The test class &apos;org.richresume.client.home.HomeControllerGwtTest&apos; 
was not found in module &apos;org.richresume.client.Application&apos;; no compilation unit for that type was seen
  at com.google.gwt.junit.JUnitShell.checkTestClassInCurrentModule(JUnitShell.java:193)
  at com.google.gwt.junit.JUnitShell.runTestImpl(JUnitShell.java:628)
  at com.google.gwt.junit.JUnitShell.runTest(JUnitShell.java:150)
  at com.google.gwt.junit.client.GWTTestCase.runTest(GWTTestCase.java:219)
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;To fix this, open the Run Dialog again, click on the &lt;strong&gt;Classpath&lt;/strong&gt; tab and click on &lt;strong&gt;User Entries&lt;/strong&gt;. Click on the &lt;strong&gt;Advanced&lt;/strong&gt; button and select &lt;strong&gt;Add Folders&lt;/strong&gt;. In the Folder Selection dialog, select your source and test directories (e.g. &lt;code&gt;src/main/java&lt;/code&gt; and &lt;code&gt;src/test/java&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Run the test again and you should see a green bar in your JUnit tab.&lt;/li&gt;
&lt;li&gt;To create a JUnit configuration that runs all tests, duplicate the previously mentioned run configuration. Then change the name to &quot;All Tests&quot; and select the 2nd radio button to run all tests in the project. &lt;/li&gt;
&lt;li&gt;Click Run to execute all the tests in the project.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Running GWT Tests in IDEA&lt;/strong&gt;&lt;br/&gt;
You should be able to run your GWT tests from within IDEA using the following steps.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Right-click on a test that extends GWTTestCase and go to &lt;strong&gt;Run &quot;&lt;em&gt;TestName&lt;/em&gt;GwtTes...&quot;&lt;/strong&gt;. It&apos;s likely you will see the error message below.
&lt;pre style=&quot;color: red; margin-top: 5px&quot;&gt;Invalid launch configuration: -XstartOnFirstThread not specified.

On Mac OS X, GWT requires that the Java virtual machine be invoked with the
-XstartOnFirstThread VM argument.

Example:
  java -XstartOnFirstThread -cp gwt-dev-mac.jar com.google.gwt.dev.GWTShell
&lt;/pre&gt;	
&lt;/li&gt;
&lt;li&gt;If you get a compiler error instead, you may need to add the GWT Facet to your project. To do this, right-click on your project&apos;s top-most folder in the left pane. Select &lt;strong&gt;Module Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Facets&lt;/strong&gt; and enable GWT for your module. &lt;/li&gt;
&lt;li&gt;To fix the &lt;code&gt;-XstartOnFirstThread&lt;/code&gt; issue, go to &lt;strong&gt;Run&lt;/strong&gt; &amp;gt; &lt;strong&gt;Edit Configurations&lt;/strong&gt;. Add the following values to the VM Arguments field. The 2nd value is to increase the amount of memory available to the test and avoid an OOM error. 
&lt;pre style=&quot;margin-top: 5px; margin-bottom: 5px&quot;&gt;-XstartOnFirstThread -Xmx512M&lt;/pre&gt;
&lt;strong&gt;NOTE:&lt;/strong&gt; If you still get a compiler error, see &lt;a href=&quot;http://www.jetbrains.net/devnet/docs/DOC-1114&quot;&gt;this page&lt;/a&gt; for a possible solution.&lt;/li&gt;
&lt;li&gt;Run the test again and you should see a green bar in your Run tab.&lt;/li&gt;
&lt;li&gt;To create a JUnit configuration that runs all tests, duplicate the previously mentioned run configuration. Then change the name to &quot;All Tests&quot; and change the Test configuration to search for tests in the whole project.&lt;/li&gt;
&lt;li&gt;Run the new configuration to execute all the tests in the project.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Testing GWT applications isn&apos;t as straightforward as writing JUnit tests, but I do believe it&apos;s getting better. If you have any additional tips and tricks, please let me know.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_light_appfuse_maven_archetypes</id>
        <title type="html">AppFuse Light &#187; AppFuse, Maven Archetypes and Shared Web Assets</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_light_appfuse_maven_archetypes"/>
        <published>2008-10-29T02:18:59-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="archetypes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuselight" scheme="http://roller.apache.org/ns/tags/" />
        <category term="svn" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="architecture" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last night, I stayed up into the wee hours of the morning working on something I&apos;ve been wanting to do for a long time. It wasn&apos;t until I was &lt;a href=&quot;http://raibledesigns.com/rd/entry/great_weekend_in_montana&quot;&gt;trouncing around the woods&lt;/a&gt; in Montana that I realized how easy it would be. The &lt;em&gt;something I&apos;ve wanted to do&lt;/em&gt; was to modify AppFuse Light to use AppFuse&apos;s core modules (service and dao). It only took me a few hours to make it happen and it inspired additional ideas. 
&lt;/p&gt;
&lt;p&gt;
I believe the major mistake we made in AppFuse 2.x was making it easy for user&apos;s to upgrade their applications. We currently use the &lt;a href=&quot;http://maven.apache.org/plugins/maven-war-plugin/&quot;&gt;maven-war-plugin&lt;/a&gt; and our own &lt;a href=&quot;http://static.appfuse.org/maven-warpath-plugin&quot;&gt;maven-warpath-plugin&lt;/a&gt; to make it possible to include AppFuse classes and assets in your project. You can easily &lt;a href=&quot;http://static.appfuse.org/movies/2.0/helloworld.mov&quot;&gt;start a new project&lt;/a&gt; w/o having a whole bunch of files in your project. The problem is, you can&apos;t easily use &quot;mvn jetty:run&quot; to work on your project. Of course, you can use &quot;mvn appfuse:full-source&quot; to solve this, but I&apos;m starting to think more and more that &quot;full-source&quot; should be the default. This is what we did in 1.x and it seems to be the more natural pattern for folks using AppFuse.
&lt;/p&gt;
&lt;p&gt;That hard part about moving to &quot;full-source&quot; by default is coming up with a way to share common assets and classes among wars and war projects. Sure, I can copy all the shared images, css and js
into each project - but that could become a maintenance nightmare. Subversion 1.5 with relative svn:externals might solve this, but it still seems kinda hacky. I don&apos;t want to use the maven-war-plugin because the overlay is kinda hokey and I think it&apos;s easier for users to understand when everything
is in their project.
 AppFuse&apos;s current directory structure in SVN looks as follows. I&apos;ve added indicators of what is in each directory.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;img src=&quot;//farm4.static.flickr.com/3231/2982950627_d846cda59b_o.png&quot; width=&quot;480&quot; height=&quot;148&quot; alt=&quot;AppFuse Web SVN&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;Rather than using AppFuse&apos;s current (manual) archetype-creation process, I&apos;d like to move to a more automated creation process using the maven-archetype-plugin&apos;s &lt;a href=&quot;http://maven.apache.org/plugins/maven-archetype-plugin/create-from-project-mojo.html&quot;&gt;create-from-project&lt;/a&gt; feature. I&apos;d like to figure out a way where I can have the source code and assets from web/common included in each of the other web/* projects (both when using &quot;jetty:run&quot; and &quot;archetype:create-from-project&quot;). One idea I thought of is to make
Jetty/Maven aware of multiple src/war directories for &quot;jetty:run&quot; and &quot;package&quot; and then
somehow hook into the archetype plugin at creation time to pull in the
shared resources. I don&apos;t know if something like this is possible. If you know of a good solution to this &lt;em&gt;shared web assets&lt;/em&gt; issue, I&apos;d love to hear about it.
&lt;/p&gt;
&lt;p&gt;Back to AppFuse Light. If I can figure out how to solve shared resources in web modules, I can use this in AppFuse Light to move to a modular SVN structure vs. its current &quot;use Ant to create different combinations&quot; setup. If a modular structure (like appfuse/web/*) is possible for AppFuse Light, I believe it makes sense to move its source into AppFuse&apos;s SVN repository. Below is how the directory structure might look after this move.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3165/2982969199_28fd1eefe4_o.png&quot; width=&quot;202&quot; height=&quot;181&quot; alt=&quot;AppFuse Light &#187; AppFuse&quot;/&gt;&lt;/p&gt;
&lt;p&gt;With this addition and &quot;archetype:create-from-project&quot;, we should be able to create all the &lt;em&gt;basic&lt;/em&gt; and &lt;em&gt;light&lt;/em&gt; archetypes automatically. We&apos;ll probably still need a manual archetype-creation process for modular archetypes, but I&apos;m OK with that.
&lt;/p&gt;
&lt;p&gt;The last thing I&apos;m struggling with is figuring out the best way to create archetypes for something like AppFuse. In the past, we&apos;ve used dependencies to allow users to inherit dependencies and their versions. This works, but it results in a lot of duplicate XML (in projects and archetypes) for developers. Last night, I tried using a parent project instead of dependencies and it seems to work much better. Not only do you inherit dependencies, but you also inherit plugins, profiles and properties. If you inherit, you can override, which is slick.
&lt;/p&gt;
&lt;p&gt;If you&apos;re an AppFuse user, how would you feel about having an AppFuse module as your project&apos;s parent? Would you prefer that, dependencies on AppFuse or full-source with no dependencies on AppFuse? Regardless of parent vs. dependencies, I think running &quot;appfuse:full-source&quot; should allow you to de-couple your project from AppFuse.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/applying_flash_to_java_flex</id>
        <title type="html">Applying Flash to Java: Flex and OpenLaszlo with Dustin Marx</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/applying_flash_to_java_flex"/>
        <published>2008-10-22T14:31:10-06:00</published>
        <updated>2008-10-22T20:33:08-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="comparison" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="softwaresummit" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="flash" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ria" scheme="http://roller.apache.org/ns/tags/" />
        <category term="openlaszlo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="flex" scheme="http://roller.apache.org/ns/tags/" />
        <category term="adobe" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">If you&apos;re going to choose Flex or OpenLaszlo, chances are you&apos;re targeting Flash. The Flash Player allows you to abstract the browser idiosyncrasies and give users a better experience. It hides the browser quirks from both developers and users. It&apos;s also a highly ubiquitous web browser runtime environment. It provides a user experience way beyond traditional HTTP request-response. Also, its visual effects and &quot;richness&quot; rival of non-browser desktop applications.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://marxsoftware.blogspot.com/&quot;&gt;Mark&apos;s blog&lt;/a&gt; stats show that 95% of readers are using Flash 9 and 1% is Flash 10. All others don&apos;t have their version exposed. Most other sources claim that Flash 9 has 98% penetration in mature markets. One of the nicest things about Flash is it frees users from limitations of traditional web applications. Request/response is largely a thing of the past and Ajax-like behavior was built-in from the beginning.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flash Criticisms&lt;/strong&gt;: has reduced SEO as well as bookmarking and URL history support. 
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flash Player Criticisms&lt;/strong&gt;: not open source, no significant alternative, no 64-bit player, loading performance and it&apos;s only useful for games, movies and annoying advertisements.&lt;/p&gt;
&lt;p&gt;
The good news is Flash is getting better. There&apos;s currently a SWF Searchability initiative with Google and Yahoo!. For bookmarking and URL History, you can use &quot;deep linking&quot; with &lt;code&gt;mx.managers.BrowserManager&lt;/code&gt; and &lt;code&gt;mx.managers.HistoryManager&lt;/code&gt;. Flash Player issues are also being addressed. There&apos;s a Flash Open Screen Project, there&apos;s a 64-bit player in Adobe Labs and Flash 9/10 is much better than in the past.
&lt;/p&gt;
&lt;p&gt;
To prove that Flash is a compelling technology, all you have to do is look at Microsoft&apos;s Silverlight and Sun&apos;s JavaFX. These are direct competitors that are fairly new and prove that companies like what Flash has.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flex&lt;/strong&gt;&lt;br/&gt;
Flex is not Flash. Flex requires Flash (9+), but Flash does not require Flex. Flex is a language and framework and applications are compiled into &lt;strong&gt;.swf&lt;/strong&gt; files. Flash is the runtime environment that executes .swf files. Flex 3 is FREE. The Flex SDK, compiler and debugger are open source. They have no license costs. BlazeDS is also open source and has no license cost.
&lt;/p&gt;
&lt;p&gt;Flex MXML was formerly called &lt;em&gt;Macromedia XML&lt;/em&gt;. It&apos;s an XML-based presentation/layout language that&apos;s editable with any text editor or IDE. MXML is to ActionScript 3 as JSP is to Java. MXML provides the layout and ActionScript provides the dynamic business logic.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ActionScript&lt;/strong&gt;&lt;br/&gt;
ActionScript is an ECMAScript implementation that&apos;s been proposed as the Edition 4 implementation. It&apos;s not your older sibling&apos;s JavaScript. It uses class-based object-oriented features and static typing. Thanks to the Flash Player, it works the same across multiple browsers. Most of the things you can do with MXML, you can do with ActionScript. However, MXML typically requires less LOC.
&lt;/p&gt;
&lt;p&gt;ActionScript allows packages, interfaces, inheritance, objects and methods. It includes extensive XML Support, particularly E4X (ECMAScript for XML). It has a large class library and can talk directly to the Flash Player. Finally, it has many Java-like features and it&apos;s syntax looks similar.
&lt;/p&gt;
&lt;p&gt;At this point, Dustin started doing demos of two popular Flex components: RichText Editor (which creates horrible HTML) and Data Grid. More third-party Flex components seem to appear every day. Examples include &lt;a href=&quot;http://code.google.com/p/flexlib/&quot;&gt;flexlib&lt;/a&gt;, &lt;a href=&quot;http://code.google.com/p/asdia/&quot;&gt;ASDIA&lt;/a&gt; as well as all those listed on &lt;a href=&quot;http://flexbox.mrinalwadhwa.com/&quot;&gt;FlexBox&lt;/a&gt;. Additionally, it&apos;s not too difficult to create your own Flex components (no proof provided).&lt;/p&gt;
&lt;p&gt;
Flex&apos;s property binding is one of Dustin&apos;s favorite features, but he says he has a difficult time conveying how cool it is. Property binding allows you to tie data in one object to data in another object. Updates in one object affect another. To use it in MXML, you can use curly braces or the &lt;code&gt;&lt;mx:Binding&gt;&lt;/code&gt; tag. In ActionScript, you can use the &lt;code&gt;BindingUtils&lt;/code&gt; object. You can also use Flex&apos;s metadata annotation &quot;Bindable&quot; to denote bindable objects.
&lt;/p&gt;
&lt;p&gt;To compile Flex applications, you can use &lt;strong&gt;mxmlc&lt;/strong&gt; from the command line. You can use Ant with the &lt;code&gt;&amp;lt;exec&gt;&lt;/code&gt; task or using Flex&apos;s Ant Tasks. You can also invoke mxmlc from Java as long as you include mxmlc.jar in your classpath. FlexBuilder is an Eclipse-based IDE that&apos;s not included with the free Flex SDK. It&apos;s not a free product and can be used as a plugin or a standalone IDE.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flex and Java&lt;/strong&gt;&lt;br/&gt;
There&apos;s two predominant out-of-the-box methods for Flex to communicate with Java EE backends.
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;HttpService&lt;/strong&gt;: traditional HTTP request/response.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebService&lt;/strong&gt;: SOAP-based Web Services.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the above two methods aren&apos;t fast enough, you can use BlaseDS and it&apos;s additional options.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Web Messaging&lt;/strong&gt;: HTTP publish/subscribe with JMS, ColdFusion and/or other Flash/Ajax client.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remoting with AMF&lt;/strong&gt;: access server-side objects from Flash client-tier as if they were hosted there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Flash applications can access either a client&apos;s machine or a remote site, but not both. You can use a &lt;em&gt;crossdomain.xml&lt;/em&gt; file on your server to allow remote Flash clients to connect. This file allows access for both Flex and OpenLaszlo applications.
&lt;/p&gt;
&lt;p&gt;BlazeDS adds proxy server support for HTTPService and WebService. To use, set the &lt;em&gt;useProxy&lt;/em&gt; attribute to &quot;true&quot;. Features include authentication and logging. It adds a new RPC mechanisms called &lt;strong&gt;RemoteObject&lt;/strong&gt;. This object allows ActionScript and Java EE transparent integration. It also adds publish/subscribe messaging with a JMS Adapter available. Lastly, it adds Ajax support to your Flex application.&lt;/p&gt;
&lt;p&gt;GraniteDS is an open-source (LGPL) alternative to Adobe LiveCycle and is similar to BlazeDS. It has COMET-like functionality and supports Spring, Spring Security, EJB 3, Seam and Guice.&lt;/p&gt;
&lt;p&gt;Flex Frameworks: Cairngorm (Adobe Consulting), Pure MVC, Mate and many others.&lt;/p&gt;
&lt;p&gt;Flex 4 (Gumbo) will have improvements for designers (easier customization, better tool support), improvements for developers (faster compiler, two-way data binding) and will leverage new features of Flash 10.
&lt;p&gt;&lt;strong&gt;OpenLazlo&lt;/strong&gt;&lt;br/&gt;
OpenLaszlo 4 is XML-based and uses an XPath syntax for data access. OpenLaszlo was actually created before Flex and is ECMAScript-based. Unlike Flex that requires Flash 9, OpenLaszlo is architected to deploy on different runtime environments, including: Flash 7/8/9 and DHTML. Dustin believes OpenLaszlo would be a lot more appealing if your source code could be compiled into Silverlight or JavaFX.
&lt;/p&gt;
&lt;p&gt;OpenLaszlo&apos;s syntax looks a lot like Flex, except it does not use namespaces. OpenLaszlo&apos;s Constraints are similar to Flex&apos;s property binding, except the syntax is a bit different. You use &lt;code&gt;${}&lt;/code&gt; in LZX tags or &lt;code&gt;applyConstraint()&lt;/code&gt; and &lt;code&gt;LzDelegate&lt;/code&gt; in scripts. OpenLaszlo&apos;s event handling is similar to Flex and JavaScript event handling. All attributes have an implicit &quot;on&quot; event that is triggered when an attribute&apos;s value is changed. Event handlers can be written CSS-style in LZX nodes or using the &lt;code&gt;&amp;lt;handler&gt;&amp;lt;/handler&gt;&lt;/code&gt; tag. Script code can be embedded in LZX XML in many ways:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Inside event attributes&lt;/li&gt;
&lt;li&gt;Within &lt;code&gt;&amp;lt;script&gt;&amp;lt/script&gt;&lt;/code&gt; tags&lt;/li&gt;
&lt;li&gt;Within &lt;code&gt;&amp;lt;method&gt;&amp;lt/method&gt;&lt;/code&gt; tags&lt;/li&gt;
&lt;li&gt;Within &lt;code&gt;&amp;lt;handler&gt;&amp;lt/handler&gt;&lt;/code&gt; tags&lt;/li&gt;
&lt;li&gt;In a separate file (&lt;code&gt;&amp;lt;script src=&quot;someFile.js&quot; /&gt;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dustin believes the debugger and view-source tools in OpenLaszlo are much better than the ones available for Flex.&lt;/p&gt;
&lt;p&gt;For the rest of the presentation, Dustin covered many of Laszlo&apos;s feature, how they relate to Java as well as how to integrate SWF and HTML. &lt;a href=&quot;http://code.google.com/p/swfobject/&quot;&gt;SWFObject&lt;/a&gt; is Dustin&apos;s preferred method for adding Flash to HTML. One of its nifty features is it allows SWF-to-SWF communication.&lt;/p&gt;
&lt;p&gt;This talk was an excellent and in-depth overview of Flash, Flex and OpenLaszlo. I especially liked all the details on ActionScript and the different methods for remote communication. &lt;em&gt;Nice job Dustin!&lt;/em&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/comprehensive_project_intelligence_with_jason</id>
        <title type="html">Comprehensive Project Intelligence with Jason van Zyl</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/comprehensive_project_intelligence_with_jason"/>
        <published>2008-10-21T14:35:13-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="m2eclipse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="softwaresummit" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hudson" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="nexus" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">In this talk, &lt;a href=&quot;http://blogs.sonatype.com/people/jvanzyl/&quot;&gt;Jason&lt;/a&gt; is going to talk about &lt;a href=&quot;http://m2eclipse.codehaus.org/&quot;&gt;m2eclipse&lt;/a&gt;, &lt;a href=&quot;http://nexus.sonatype.org/&quot;&gt;Nexus&lt;/a&gt;, &lt;a href=&quot;https://hudson.dev.java.net/&quot;&gt;Hudson&lt;/a&gt; and &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven&lt;/a&gt;. On his Maven bullet-point, it says &quot;The best is yet to come (and we&apos;ll fix a bunch of stuff)!&quot; 
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;m2eclipse&lt;/strong&gt;&lt;br/&gt;The m2eclipse plugin has improved greatly in the last 4 months - there&apos;s now 5 full-time developers working on it. If you use the m2eclipse plugin, you never have to leave the IDE for your Maven-related work. m2eclipse has a Configuration Framework that turns Maven&apos;s mumbo-jumbo (Jason&apos;s words, not mine) into Eclipse talk. The m2eclipse+configuration framework has integration for WTP, JDT, AJDT and they&apos;re working on one for Flex. Below is a screenshot of how m2eclipse helps developers stay away from using command-line Maven.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3042/2962624266_05dc42835c_o.png&quot; title=&quot;m2eclipse Configuration Framework&quot; rel=&quot;lightbox[m2eclipse]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3042/2962624266_cbf14978ff_m.jpg&quot; width=&quot;240&quot; height=&quot;188&quot; alt=&quot;m2eclipse Configuration Framework&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Now Jason is showing a demo of m2eclipse and creating a new Maven project from existing archetypes. It looks like m2eclipse uses &quot;Nexus Indexer&quot; as its Catalog. Presumably this is a Sonatype-hosted service. The Nexus Indexer contains an of Maven Central and is very fast. It&apos;s dynamically updated as new things are deployed to Maven Central.&lt;/p&gt;

&lt;p&gt;If you use m2eclipse and open a pom.xml, you&apos;ll get a visual view rather than an XML view. This UI has tabs for Overview, Dependencies, Repositories, Build, Plugins, Reporting, Profiles, Team, a Dependency Hierarchy and Dependency Graph. You can easily add new dependencies and it finds things quickly because it&apos;s using the Nexus index. In addition to visually adding dependencies, you can modify the raw XML and get things like groupId and version code-completion. 
&lt;/p&gt;
&lt;p&gt;
Once you have your dependencies listed in a &quot;Maven Dependencies&quot; container to you can &quot;Materialize Project&quot; to create a project from the binary dependency. You&apos;ll get the source as a new project in your workspace as well as having your binary dependency turned into a source dependency.&lt;/p&gt;

&lt;p&gt;You can easily create a run configuration that runs certain goals, allows you to activate profiles and uses an embedded version of Maven or an external installation. I asked Jason if the Dependency Hierarchy had a right-click -&gt; exclude feature and he said it doesn&apos;t exist yet, but it will in the release after next. For now, the &lt;em&gt;pom editor&lt;/em&gt; is just eye candy and doesn&apos;t have actions.
&lt;/p&gt;
&lt;p&gt;For Maven Plugins, m2eclipse has workspace resolution so you can develop a plugin and use it in a project at the same time w/o having to install the plugin over and over.&lt;/p&gt;
&lt;p&gt;Sonatype has created a Project Materializer Plugin that allows a team lead to create a project for developers. It allows you to create a welcome page that has links, cheat sheets, News and Updates and Tasks for the developer. It also materializes Eclipse projects in the background. Cheat Sheets are a series of tasks that can be run to show developers how to do things.&lt;/p&gt;
&lt;p&gt;Another big feature in m2eclipse is nested project support. It only works in Eclipse 3.4 though.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nexus&lt;/strong&gt;&lt;br/&gt;Nexus is a repository manager that allows you to keep the cruft from the outside world out of your system. It&apos;s primarily for Repository and Configuration Management. It has fine-grained security for authentication and authorization.  One nice feature of its security system is you can prevent certain users from seeing source JARs. It also has &lt;em&gt;virtual&lt;/em&gt; repositories (a savior for OSGi lovers). UI is written in Ext JS and acts as a simple REST client for Nexus. It has a full REST API using RESTlet.
&lt;/p&gt;&lt;p&gt;A repository manager allows you to protect yourself from the &lt;strong&gt;Open Source Ghetto&lt;/strong&gt;. The OS Maven Ghetto has bad POMs, repositories in POMs, mixed snapshot and release dependencies and screwed up metadata. Not only does it offer protection, but it allows you to aggregate repositories and publish your internal artifacts to it. It also allows you to schedule tasks that clean out snapshots so your repositories don&apos;t grow out of control.
&lt;/p&gt;
&lt;p&gt;Typically people deal with OSGi runtimes manually. OSGi can dynamically update dependencies that you drop into your bundle repository. However, many folks maintain their OSGi runtime and bundle repository locally. Some people are trying to get an OSGi runtime to resolve against a P2 repository. P2 is what Eclipse uses for their repository management. Nexus has the ability to lock down the versions that are available to an OSGi runtime. Furthermore, you can use Nexus to manage the versions that get deployed to all your servers. This makes it a lot easier for QA and Production to manage versions of your artifacts. OSGi is great for modularity and solving classpath issues, but it does have issues with versions and how its ranges work.&lt;/p&gt;
&lt;p&gt;You can see Nexus in action at &lt;a href=&quot;http://repository.sonatype.org/&quot;&gt;http://repository.sonatype.org&lt;/a&gt;. It can be configured entirely through the UI, an XML file or through the REST API. RSS feeds exist for configuration and repository updates.
&lt;/p&gt;
&lt;p&gt;Nexus is free and open source with a GPL license. The next version (1.2) will contain a Plugin API to allow extensions. All of Sonatype&apos;s enhancements for its commercial version will be written as plugins. A matrix of what&apos;s available in the open source version vs. commercial version should be published sometime next week.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;br/&gt;
Jason believes that Hudson is the future of continuous integration, on-demand results and release management. They&apos;re writing all their extension points in Hudson as Maven plugins and Plexus components (with the work they&apos;ve done, using Spring components should also be possible). Other enhancements they&apos;ve made to Hudson:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Integration of JSecurity&lt;/li&gt;
&lt;li&gt;Implementing a similar REST layer as Nexus and creating a UI using Ext JS&lt;/li&gt;
&lt;li&gt;Automatic installation of external Maven installations&lt;/li&gt;
&lt;li&gt;Drools Workflow Integration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They&apos;ve also enhanced Hudson so it can easily test/publish Maven projects without using the free-form project template. Hudson works well for doing Eclipse headless builds for Eclipse plugins. If you need to test against multiple databases, multiple OS&apos;s, it does support a grid-based system that&apos;s easy to setup. Hudson does have web services integration that allows you to kick off builds from within Eclipse. Sonatype uses Hudson to run all their nightly builds of Maven.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maven - the best is yet to come&lt;/strong&gt;&lt;br/&gt;
The three big things coming in the next version of Maven are:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Refactored Project Builder: includes a spec for building a pom, domain-specific parsers (attribute-based XML, Groovy and Ruby) and mixins.&lt;/li&gt;
&lt;li&gt;Mercury: a new repository and transport layer. Developed by the Jetty people and is super fast (async client with connection pooling and parallelization). Has atomic downloads and deployments (with Nexus), full PGP support and a WebDAV client built-in.&lt;/li&gt;
&lt;li&gt;Maven Embedder: re-written to actually work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, a good talk with lots of demos. I&apos;m definitely looking forward to Maven improvements in the future.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/integrating_compass_2_0_into</id>
        <title type="html">Integrating Compass 2.0 into AppFuse</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/integrating_compass_2_0_into"/>
        <published>2008-05-22T21:24:47-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="displaytag" scheme="http://roller.apache.org/ns/tags/" />
        <category term="compass" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
Last week, Chris Barham showed us an example of &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_displaytag_external_sorting_and&quot;&gt;how to implement external sorting and paging with AppFuse + DisplayTag&lt;/a&gt;. This week, he&apos;s at it again with a tutorial titled &lt;a href=&quot;http://code.google.com/p/pagingappfuse/wiki/CompassSearching&quot;&gt;Searching in AppFuse 2.0.2 with Compass 2.0 and Lucene 2.3.2&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
From a &lt;a href=&quot;http://www.nabble.com/Appfuse-searching-with-Compass-2.0-(Lucene)-td17368089s2369.html&quot;&gt;message&lt;/a&gt; he sent to the mailing list:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I&apos;ve extended the previous DisplayTag external sorting and paging project to implement full search capability across the domain objects by using Compass 2.0 - &lt;a href=&quot;http://www.compass-project.org&quot;&gt;http://www.compass-project.org&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
Although there are a number of tutorials around for Compass and AppFuse, I thought I&apos;d update as Compass has just gone to version 2.0 and has new features, (annotations etc).
&lt;br/&gt;&lt;br/&gt;
Search results in the example are displayed in plain HTML with Compass&apos; own paging feature, and also using DisplayTag with its paging external feature, (both on the same search results page in the example).
&lt;br/&gt;&lt;br/&gt;
Code is in a branch off the original project called branches/search - check it out with:
&lt;br/&gt;&lt;br/&gt;
&lt;em&gt;svn checkout http://pagingappfuse.googlecode.com/svn/branches/search/ appfusecompass&lt;/em&gt;
&lt;br/&gt;&lt;br/&gt;
Instructions on how to implement Compass are here:&lt;br/&gt;
&lt;a href=&quot;http://code.google.com/p/pagingappfuse/wiki/CompassSearching&quot;&gt;http://code.google.com/p/pagingappfuse/wiki/CompassSearching&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
Cheers,&lt;br/&gt;
Chris
&lt;/p&gt;
&lt;p&gt;Again, great work Chris! We really appreciate your contributions.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/issues_with_antrun_plugin_and</id>
        <title type="html">Issues with AntRun Plugin and Maven</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/issues_with_antrun_plugin_and"/>
        <published>2008-05-10T18:23:26-06:00</published>
        <updated>2008-05-11T00:31:04-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="ant" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">I started seeing the following error today when using Maven and the AntRun Plugin.&lt;/p&gt;
&lt;pre&gt;
[INFO] [antrun:run {execution: default}]
[INFO] Executing tasks
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error executing ant tasks
	
Embedded error: java.lang.IllegalAccessError: tried to access method 
org.apache.tools.ant.launch.Locator.decodeUri(Ljava/lang/String;)Ljava/lang/String; 
from class org.apache.tools.ant.AntClassLoader
&lt;/pre&gt;
&lt;p&gt;Searching the internet provided no results, so I was pretty stumped - especially since this error didn&apos;t happen on my MacBook Pro. It happened on &lt;a href=&quot;http://builds.appfuse.org&quot;&gt;AppFuse&apos;s Bamboo&lt;/a&gt; server (Linux), but not locally. Luckily, I was able to reproduce it on my Windows box and discovered the solution: &lt;strong&gt;upgrade to a newer version of Maven&lt;/strong&gt;. I was using 2.0.6/2.0.7 and upgrading to 2.0.9 fixed the problem.&lt;/p&gt;
&lt;p&gt;BTW, when is the Ant project going to release a new version of Ant? The current 1.7.0 version &lt;a href=&quot;http://issues.appfuse.org/browse/APF-970&quot;&gt;doesn&apos;t support spaces in path names&lt;/a&gt;, which seems like a pretty big issue to me (especially for Windows users).</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/upgrading_to_spring_security_2</id>
        <title type="html">Upgrading to Spring Security 2.0</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/upgrading_to_spring_security_2"/>
        <published>2008-04-17T02:45:47-06:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="security" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springsecurity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="acegi" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">This evening I spent a few hours and upgraded &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; to use &lt;span style=&quot;text-decoration: line-through&quot;&gt;Acegi&lt;/span&gt; &lt;a href=&quot;http://www.springframework.org/node/627&quot;&gt;Spring Security 2.0&lt;/a&gt;. The upgrade was fairly straightforward:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;%s/org.acegisecurity/org.springframework.security/g&lt;/li&gt;
&lt;li&gt;Upgraded dependencies (exclusions are necessary if you&apos;re using Spring 2.5.x and don&apos;t want 2.0.x dependencies pulled in):
&lt;pre style=&quot;margin-top: 10px&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-security-core-tiger&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${spring.security.version}&amp;lt;/version&amp;gt;
    &amp;lt;exclusions&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-core&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-support&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
...
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-security-taglibs&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${spring.security.version}&amp;lt;/version&amp;gt;
    &amp;lt;exclusions&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-web&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;Changed taglib prefix from &quot;authz&quot; to &quot;security&quot; and change the associated taglib declaration to:
&lt;pre style=&quot;margin-top: 10px&quot;&gt;
&amp;lt;%@ taglib uri=&quot;http://www.springframework.org/security/tags&quot; 
    prefix=&quot;security&quot; %&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;In web.xml, I changed &amp;lt;filter-class&amp;gt; to &lt;em&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/em&gt;. Since I didn&apos;t name my filter &lt;em&gt;springSecurityFilterChain&lt;/em&gt;, I also had to add the following &amp;lt;init-param&amp;gt;:
&lt;pre style=&quot;margin-top: 10px&quot;&gt;
    &amp;lt;init-param&amp;gt;
        &amp;lt;param-name&amp;gt;targetBeanName&amp;lt;/param-name&amp;gt;
        &amp;lt;param-value&amp;gt;springSecurityFilterChain&amp;lt;/param-value&amp;gt;
    &amp;lt;/init-param&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Lastly, I modified security.xml to use the &lt;a href=&quot;http://static.springframework.org/spring-security/site/reference/html/ns-config.html&quot;&gt;new syntax&lt;/a&gt;. AppFuse&apos;s security.xml went from &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/common/src/main/webapp/WEB-INF/security.xml?r1=3044&amp;amp;r2=3089&quot;&gt;175 lines to 33&lt;/a&gt; with the new security namespace configuration!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s hard to believe I first looked at Acegi almost &lt;a href=&quot;http://sourceforge.net/mailarchive/message.php?msg_name=E1BJ4Z3-0001A8-Ic%40sc8-sf-mx1.sourceforge.net&quot;&gt;4 years ago&lt;/a&gt;. At that time, I said it contained too much XML for my needs. Ben&apos;s reaction:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Seriously, the &quot;whole lotta XML&quot; gives you exponentially more power and
flexibility than a method such as this could ever hope to provide you.
&lt;/p&gt;
&lt;p&gt;It&apos;s nice to see that Spring Security 2.0 gives you exponentially more power and flexibility without all the XML. &lt;em&gt;Thanks guys!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;P.S. You can also view the &lt;a href=&quot;http://source.appfuse.org/changelog/appfuse/?cs=3089&quot;&gt;full changelog&lt;/a&gt; for this upgrade.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; If you&apos;re using &amp;lt;authz:authentication property=&quot;fullName&quot;/&amp;gt; in your JSPs, you&apos;ll need to change it to &amp;lt;security:authentication property=&quot;principal.fullName&quot;/&amp;gt;.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/maven_integration_for_eclipse</id>
        <title type="html">Maven Integration for Eclipse</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/maven_integration_for_eclipse"/>
        <published>2008-03-12T16:22:43-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="eclipse" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">If you&apos;re a &lt;a href=&quot;http://maven.apache.org&quot;&gt;Maven&lt;/a&gt; user and like Eclipse, you might want to checkout the &lt;a href=&quot;http://www.jroller.com/eu/entry/m2eclipse_0_9_0&quot;&gt;new
Maven Integration Plugin for Eclipse 0.9.0&lt;/a&gt;. Euxx has a couple blog posts talking about the new features - looks like pretty cool stuff to me.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.jroller.com/eu/entry/maven_indexes&quot;&gt;Indexing Maven repositories&lt;/a&gt; - for offline browsing of repositories.
&lt;img src=&quot;//www.jroller.com/eu/resource/mavenindexesviewtc.png&quot; width=&quot;371&quot; height=&quot;283&quot; alt=&quot;Offline Browsing&quot; style=&quot;margin: 10px; border: 1px solid silver&quot; /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot;&gt;Making a good use of Maven metadata&lt;/a&gt; - materializing projects from dependencies.
&lt;br/&gt;
&lt;img src=&quot;//www.jroller.com/eu/resource/mavenmaterialize1.png&quot; width=&quot;369&quot; height=&quot;398&quot; alt=&quot;Materialize Project&quot; style=&quot;margin: 10px; border: 1px solid silver&quot; /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second feature is especially cool. If your dependencies supply SCM information - you can import the project from its source control system. Maven may have warts, but it also has incredible potential.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/building_a_better_maven_with</id>
        <title type="html">Building a Better Maven with Ant</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/building_a_better_maven_with"/>
        <published>2008-02-11T14:07:12-07:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ant" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">It looks like the &lt;a href=&quot;http://www.nabble.com/-DISCUSS--EasyAnt%3A-Ant-based-pre-packaged-build-system-for-java-projects-td14735371.html&quot;&gt;Ant folks are thinking of building a better Maven&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I see many developers adopt Maven because they want a build system able to
provide common features with no effort. Most of them don&apos;t want to spend
much time writing an Ant script, or have seen or heard that maintaining Ant
build scripts is troublesome. So they choose to use Maven only because it&apos;s
easy to use for common use cases: install, write a simple pom of a few lines
or generate it using an archetype, and you&apos;re ready to compile, test and
package your new project following the Maven standard structure. They also
get dependency management for free, and with only a few more effort they
have multi module builds, and some nice features like code analysis,
coverage, and a set of report gathered in a web site. That&apos;s really nice and
that&apos;s what I like about Maven.
&lt;br/&gt;&lt;br/&gt;
But Maven suffers from a lack of flexibility and robustness IMHO. And later
the same people who first adopted Maven because of its perceived ease of use
become frustrated when they need to tweek the system to their own needs or
don&apos;t understand how the release plugin work. Then some of them go back to
Ant, first having to go through a sometimes painful road to describe their
whole build system in xml, especially if they aren&apos;t Ant experts. Others try
to use new build tools like raven, buildr or others.
&lt;br/&gt;&lt;br/&gt;
I really like Ant, and think it is a very good basis for robust and flexible
build systems. People with enough knowledge of Ant can write very good build
systems, testable, maintainable and adaptable. But you need to get your
hands dirty, and you need to get a good knowledge of some of the mechanisms
which can make an Ant based build system manageable: import, scripts and
scriptdef, macrodef, presetdef, and so on. [&lt;a href=&quot;http://www.nabble.com/-DISCUSS--EasyAnt%3A-Ant-based-pre-packaged-build-system-for-java-projects-td14735371.html&quot;&gt;Read More&lt;/a&gt;]
&lt;/p&gt;
&lt;p&gt;
What do you think - is this a good idea? 
&lt;/p&gt;
&lt;p&gt;
I agree that Maven has its warts, but I don&apos;t think it&apos;s &lt;em&gt;that&lt;/em&gt; bad. I&apos;ve also heard that Maven has been successfully implemented at large companyies like eBay, Intuit and E*Trade[1]. Is the &quot;Maven sucks&quot; meme largely something that exists in the blogosphere, but not in the real world?
&lt;/p&gt;
&lt;p&gt;I think the biggest benefit of Maven is dependency management. I think it makes your code more modular and easier to build. Rather than having a monolithic source-code tree that depends on itself being built in a certain order, you can have individual modules that pull dependencies from a central location. This can be done with Maven&apos;s Ant Tasks as well. I don&apos;t see a problem with building a better Maven with Ant, but to try and build a better Central Repository sounds like a nightmare to me. The current repository has been improved for years and is much better than it was a couple years ago. That being said, I would &lt;em&gt;love&lt;/em&gt; to see somebody build a more accurate Central Repository. Ideally, it&apos;d be done sometime next week. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;[1] I could be wrong about these companies. If you&apos;re a developer at one of these companies, please confirm or deny. Any comments on Maven&apos;s success at these companies would be great as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Speaking of Maven, there&apos;s &lt;a href=&quot;http://java.dzone.com/news/don-brown-makes-maven-2-not-su#comment-775&quot;&gt;an interesting comment on a Javalobby post I wrote&lt;/a&gt;:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
With all the critical remarks the Maven project is receiving, wouldn&apos;t it be time for some Maven project lead to step up and explain the team&apos;s position? Or is it completely deaf to the sentiments? How many builds have to fail, how much more headaches are needed before others start their own version of Maven and do it the right way (like Don [Brown])?
&lt;/p&gt;
&lt;p&gt;Seems like an excellent question to me. Guys?</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/book_reviews_getting_started_with</id>
        <title type="html">Reviews: Getting Started with Grails, Rails for Java Developers and Groovy Recipes</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/book_reviews_getting_started_with"/>
        <published>2008-02-09T11:34:57-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="groovy" scheme="http://roller.apache.org/ns/tags/" />
        <category term="books" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bookreview" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rails" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Two weeks ago, I mentioned a number of books I was hoping to read to &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_do_you_get_up&quot;&gt;get up to speed on Rails and Grails quickly&lt;/a&gt;. Over the last two weeks, I was able to polish off three of these (listed in order of reading):&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/minibooks/grails&quot;&gt;Getting Started with Grails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pragprog.com/titles/fr_r4j&quot;&gt;Rails for Java Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pragprog.com/titles/sdgrvr&quot;&gt;Groovy Recipes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below are short reviews of each book.&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Getting Started with Grails&lt;/strong&gt;&lt;br/&gt;
&lt;a href=&quot;http://www.infoq.com/minibooks/grails&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/gettingstartedwithgrails.jpg&quot; alt=&quot;Getting Started with Grails&quot; width=&quot;127&quot; height=&quot;186&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;&lt;/a&gt;
&lt;em&gt;The Good:&lt;/em&gt;
This is the perfect book to learn the basics of Grails quickly. At 133 pages, I was able to read this entire book in one sitting. The first couple chapters are very introductory, but likely necessary for beginners. The good news is you start writing your first Grails application on page 7 (Chapter 3). 
&lt;/p&gt;
&lt;p&gt;
Chapter 4 (Improving the User Experience) is good in that it shows you how to do warning, error and confirmation messages. This is something often overlooked in web frameworks and Rails and its &quot;flash&quot; concept seem to have made it important again. I remember way back in 2003 when I complained about frameworks not allowing messages to live through a redirect - everyone said it was something you didn&apos;t need. Now it&apos;s a standard part of most web frameworks. 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The Bad:&lt;/em&gt; Uses Grails 0.3.1. This is understandable since the book was written in 2006 and published in 2007. Also, it doesn&apos;t cover testing that much (5 pages). If testing is so easy with Groovy and if Grails has Canoo WebTest support built-in, it should be shown IMO.&lt;/p&gt;
&lt;p&gt;

&lt;strong&gt;Rails for Java Developers&lt;/strong&gt;&lt;br/&gt;
&lt;a href=&quot;http://www.pragprog.com/titles/fr_r4j&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/railsforjavadevelopers.jpg&quot; alt=&quot;Rails for Java Developers&quot; width=&quot;120&quot; height=&quot;144&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
&lt;em&gt;The Good:&lt;/em&gt;
This was an interesting book for me because it uses AppFuse for many of its Java-based examples. Unfortunately, it uses the Struts 1.x version which is cumbersome and verbose as far as Java web frameworks go. The most impressive part of this book is how Justin and Stu do an excellent job of walking the line and not insulting Java nor developers using it. They provide an easy to understand view of Rails from a Java Developer&apos;s perspective. There&apos;s detailed chapters on ActiveRecord (as it compares to Hibernate), ActiveController (compared to Struts) and ActiveView (compared to JSP). This book has excellent chapters on Testing, Automating the Development Process and Security. 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The Bad:&lt;/em&gt; This book was published over a year ago, so it uses an older version of Rails. This means some commands don&apos;t work if you&apos;re using Rails 2.0. It&apos;s also a little light on Ruby, so I didn&apos;t feel I learned as much about the language as I was hoping to. That&apos;s understandable as it&apos;s more of a Rails book than a Ruby book. 
&lt;/p&gt;
&lt;p&gt;

&lt;strong&gt;Groovy Recipes&lt;/strong&gt; (Beta from Jan 3, 2008)&lt;br/&gt;
&lt;a href=&quot;http://www.pragprog.com/titles/sdgrvr&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/groovyrecipes-120x144.jpg&quot; alt=&quot;Groovy Recipes&quot; width=&quot;120&quot; height=&quot;144&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
&lt;em&gt;The Good:&lt;/em&gt;
I really like the style of this book and that it shows you how to get things done quickly with code samples. It&apos;s very no-nonsense in the fact that it contains a lot of code and howtos. I really like Scott&apos;s writing style and found this book the easiest to read of the three. This may have something to do with my eagerness to learn Groovy more than anything. The most refreshing part about this book is how up-to-date it is. Because it&apos;s a Beta, it seems to contain the most up-to-date information on Groovy and Grails. After reading Getting Started with Grails and working with it for a couple weeks, the first Grails chapter seemed a little basic - but that&apos;s likely because I&apos;ve figured out how to mix all those recipes already. The Grails and Web Services chapter definitely has some interesting content, but I&apos;ve rarely had a need to implement these recipes in a real-world environment. I&apos;d rather see recipes on testing the UI (with the WebTest plugin) and how to use GWT and Flex with Grails. If SOUIs are the way of the feature, this is a must.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The Bad:&lt;/em&gt; Not much information on testing with GroovyTestCase, mock objects or implementing Security. If one of Groovy&apos;s sweet spots is testing, why isn&apos;t there more coverage on this topic? The Java and Groovy integration chapter is especially good, but there&apos;s very limited information on Ant and Maven. It&apos;s likely the websites provide sufficient documentation, but the Maven section only fills 5 lines on an otherwise blank page. The biggest problem I have with this book is I really like the recipes writing style and would love to see more tips and tricks. At 250 pages, I was able to finish this book with pleasure in a few days.
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What&apos;s Next?&lt;/strong&gt;&lt;br/&gt;
Now I&apos;m reading JRuby on Rails (Apress) and Programming Groovy (Pragmatic Programmers). Following that, I&apos;ll be perusing dead-tree versions of Struts 2 Web 2.0 Projects (Apress), Prototype and script.aculo.us (Pragmatics) and Laszlo in Action (Manning). If any publishers want to send me books on GWT and Flex, I&apos;d be happy to add them to my list. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/all_web_frameworks_should_support</id>
        <title type="html">All Java web frameworks should support hot deploy of a single class</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/all_web_frameworks_should_support"/>
        <published>2008-01-24T15:11:18-07:00</published>
        <updated>2012-11-08T14:35:47-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="seam" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">In &lt;a href=&quot;http://www.nabble.com/Anyone-else-using-Groovy--td15064401.html&quot;&gt;Anyone else using Groovy?&lt;/a&gt;, Tim Fennell (inventor of &lt;a href=&quot;http://stripesframework.org&quot;&gt;Stripes&lt;/a&gt;) raves at how much he likes Groovy now that it supports Java 5 features. He writes that Groovy might offer a solution to make development with Stripes faster:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
The other thing I&apos;ve been wondering about is that if there were  
enough demand for it we could try adding &quot;improved&quot; groovy support.  
E.g. throw your groovy actions under WEB-INF and we&apos;ll use groovy&apos;s  
built in stuff to do auto-reloading etc. &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.linkedin.com/pub/1/12/415&quot;&gt;Gregg Bolinger&lt;/a&gt; responds with an excellent idea:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
It would be really cool if Stripes could automatically discover and load
changes to action beans (including new ones) without the entire app
restarting, regardless of what the action bean is written in. But I
realize that is a pretty tall order. :) &lt;/p&gt;
&lt;p&gt;I agree that it might be a tall order, but I don&apos;t think it&apos;s impossible. In fact, I think &lt;strong&gt;all Java-based web frameworks should support hot deploy of a single class&lt;/strong&gt;. We shouldn&apos;t have to buy &lt;a href=&quot;http://www.zeroturnaround.com/javarebel/&quot;&gt;JavaRebel&lt;/a&gt; to do this. It should be mandatory. 
&lt;/p&gt;
&lt;p&gt;
When an application reaches a certain size, the startup time can get pretty lengthy. This is lost development time. Furthermore, if any part of the development cycle takes longer than 15 seconds, there&apos;s a good chance developers will do something else (check their e-mail, move onto another task, etc.). Multi-tasking may be a good skill to have, but it&apos;s a horrible way to be productive. 
&lt;/p&gt;
&lt;p&gt;
Of the frameworks I&apos;m familiar with, only Tapestry 5 and Seam support reloading single classes without restarting the whole application. Why can&apos;t the other frameworks &quot;borrow&quot; Tapestry 5&apos;s code? Maybe someone should just buy &lt;a href=&quot;http://www.zeroturnaround.com/&quot;&gt;ZeroTurnaround&lt;/a&gt; and give away JavaRebel for free.
&lt;/p&gt;
&lt;p&gt;If I had one wish for 2008, it would be for all Java web frameworks to support this feature. Pretty Please?</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/denver_tech_meetup_consulting_panel</id>
        <title type="html">Denver Tech Meetup, Consulting Panel and My Jobs Timeline</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/denver_tech_meetup_consulting_panel"/>
        <published>2008-01-24T13:39:38-07:00</published>
        <updated>2008-06-13T04:50:53-06:00</updated> 
        <category term="/Open Source" label="Open Source" />
        <category term="consulting" scheme="http://roller.apache.org/ns/tags/" />
        <category term="meetup" scheme="http://roller.apache.org/ns/tags/" />
        <category term="career" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">If you live in Denver and are involved in open source (or simply technology in general), you should make it a point to attend tonight&apos;s &lt;a href=&quot;http://raibledesigns.com/rd/entry/denver_tech_meetup_january_24th&quot;&gt;Denver Tech Meetup&lt;/a&gt;. I&apos;m planning on going for about an hour. From there, I&apos;m heading over to the DeRailed User Group for a &lt;a href=&quot;http://groups.google.com/group/derailed/browse_thread/thread/d9201d1c0c7e000f&quot;&gt;Consulting Panel&lt;/a&gt; at 8. If you&apos;re interested in moving from a full-time position to contracting, you should come. This is open to the public, so anyone can attend.
&lt;/p&gt;
&lt;p&gt;While I was thinking about things to talk about on the panel tonight, I started reflecting on the jobs I&apos;ve had in my almost-11-year career in technology. Here&apos;s my timeline since college:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;1997: Full-time at MCI Systemhouse&lt;/li&gt;
&lt;li&gt;1998: Contractor for IBM Global Services (6 figures w/in 6 months of graduating!)&lt;/li&gt;
&lt;li&gt;April 1999 - April 2001: Full-time for eDeploy.com (Friday lunches rocked)&lt;/li&gt;
&lt;li&gt;May 2001 - October 2001: Contractor for Douglas County (introduced to Ant, Struts, etc.)&lt;/li&gt;
&lt;li&gt;January 2002 - November 2002: Contractor for OnPoint Digital (100% remote)&lt;/li&gt;
&lt;li&gt;December 2002 - August 2003: Contractor for Comcast Media Center&lt;/li&gt;
&lt;li&gt;August 2003 - October 2003: Contractor for ResortQuest&lt;/li&gt;
&lt;li&gt;November 2003 - June 2004: Contractor for Adams County&lt;/li&gt;
&lt;li&gt;June 2004 - August 2004: Contractor for Open Logic&lt;/li&gt;
&lt;li&gt;October 2004 - December 2004: Contractor for Oak Grove Systems&lt;/li&gt;
&lt;li&gt;January 2005 - May 2005: Contractor for Xcel Energy&lt;/li&gt;
&lt;li&gt;June 2005 - January 2007: Contractor for Virtuas&lt;/li&gt;
&lt;li&gt;February 2007 - June 2007: Contractor for Checkerboard&lt;/li&gt;
&lt;li&gt;July 2007 - Present: Contractor for LinkedIn&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Phew - that&apos;s 14 jobs in 11-ish years! Notice that I&apos;ve only ever had 2 full-time positions. So far, I have no regrets and really enjoy being a consultant. If you&apos;re interested in learning more about how I started Raible Designs or how I get contracts, you might want to read the following posts. 
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;
&lt;a href=&quot;http://raibledesigns.com/page/rd/20021114#how_i_started_raible_designs&quot;&gt;How I started Raible Designs&lt;/a&gt; (Nov 2002)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/page/rd?entry=how_do_you_become_an&quot;&gt;How do you become an independent consultant and get contracts?&lt;/a&gt; (Jan 2005)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you live in Denver and want to learn more - show up at the &lt;a href=&quot;http://hivecoop.pbwiki.com/&quot;&gt;The Hive&lt;/a&gt; at 8:00 tonight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update June 2008:&lt;/strong&gt; My 3rd full-time gig started in May. Now I&apos;m the &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_linkedin_journey_continues&quot;&gt;Lead UI Architect at LinkedIn&lt;/a&gt;.
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/migrating_a_rails_app_to</id>
        <title type="html">Migrating a Rails app to Grails</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/migrating_a_rails_app_to"/>
        <published>2008-01-22T09:37:49-07:00</published>
        <updated>2008-01-22T16:37:49-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rails" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">There&apos;s an interesting trend I&apos;ve seen happening at companies over the last year. More and more, they&apos;re experimenting with Rails and/or Grails for both prototyping and real applications. I think this is an excellent use for these frameworks as they both are very productive. The reasons for their productivity is simple: &lt;a href=&quot;http://www.theserverside.com/news/thread.tss?thread_id=35538&quot;&gt;zero turnaround&lt;/a&gt; and less code.&lt;/p&gt;
&lt;p&gt;For a Java-based company that&apos;s built their bread and butter applications on Java and been successful with it, both frameworks can be disruptive. Bread and butter applications tend to be large and somewhat difficult to maintain. In my experience, the biggest maintenance headache is &lt;em&gt;not&lt;/em&gt; writing code or fixing bugs, it&apos;s the turnaround time required to make changes, run tests and build the application to test in your browser. Since Rails and Grails eliminate the turnaround, it&apos;s only natural for developers at companies with a lengthy build process to love their increased productivity.
&lt;/p&gt;
&lt;p&gt;Over the next couple weeks, I&apos;m going to do some experimenting with porting a Rails application to Grails. Why? Because I think companies are going to have a difficult time choosing between these two frameworks for rapid prototyping and (possible) production deployments. While both frameworks are great for prototyping, the last thing most developers want to do is throw away the prototype and develop it with something else. They want to continue to enhance the prototype and eventually put it into production. With Rails and Grails (and many others), it&apos;s possible to build the real application in a matter of weeks, so why shouldn&apos;t it be put into production?&lt;/p&gt;
&lt;p&gt;For most Java-based companies, putting a Rails application into production is unfamiliar territory. However, a Grails application is just a WAR, so they can continue to use all the Java infrastructure they know and love. So for companies with an established, tuned and successful JVM infrastructure, does it really make sense to use Rails over Grails? The only thing I can think of is language reasons - there&apos;s a lot of Ruby fanatics out there.&lt;/p&gt;
&lt;p&gt;So again, the purpose of my experiment is simple: to see if a Grails app can do everything a Rails app can. As for language features and &lt;a href=&quot;http://www.theserverside.com/news/thread.tss?thread_id=48180&quot;&gt;scalability&lt;/a&gt;, I&apos;m not really concerned with that right now. I&apos;m not looking to prove that either framework should be used for all web applications - just certain types.&lt;/p&gt;
&lt;p&gt;
Has anyone out there ported a Rails application to Grails? If so, are there any gotchas I should watch out for?
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; I realize that Rails can be deployed on the JVM with JRuby. However, I think many companies have existing Java-based tools (logging, JMX, Spring backends, etc.) that more easily integrate with Grails than Rails. I could be wrong.&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/re_why_grails_doesn_t</id>
        <title type="html">RE: Why Grails doesn&apos;t use Maven</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/re_why_grails_doesn_t"/>
        <published>2008-01-16T10:49:35-07:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Graeme Rocher&apos;s in &lt;a href=&quot;http://graemerocher.blogspot.com/2008/01/why-grails-doesnt-use-maven.html&quot;&gt;Why Grails doesn&apos;t use Maven&lt;/a&gt;:
&lt;p class=&quot;quote&quot;&gt;
In his post entitled &lt;a href=&quot;http://jonasfagundes.com/blog/2008/01/grails-the-good-the-ugly-and-the-bad&quot;&gt;&quot;Grails - The Good, The Bad and the Ugly&quot;&lt;/a&gt;, Jonas has some nice praise for &lt;a href=&quot;http://grails.org/&quot;&gt;Grails&lt;/a&gt;, his main beef is that it is not built on Maven.&lt;br/&gt;&lt;br/&gt;So I wanted to clarify why exactly we chose not use &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven&lt;/a&gt; (by default) and the explanation is there for all to see in Jonas&apos; first example of creating a Grails application vs creating a Maven project:&lt;br/&gt;&lt;br/&gt;Instead of&lt;br/&gt;&lt;code&gt;&lt;br/&gt;grails create-app name&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;could be just&lt;br/&gt;&lt;code&gt;&lt;br/&gt;mvn archetype:create -U\&lt;br/&gt;-DarchetypeGroupId=net.liftweb\&lt;br/&gt;-DarchetypeArtifactId=lift-archetype-blank\&lt;br/&gt;-DarchetypeVersion=0.4\&lt;br/&gt;-DremoteRepositories=http://scala-tools.org/repo-releases\&lt;br/&gt;-DgroupId=your.proj.gid -DartifactId=your-proj-id&lt;br/&gt;&lt;br/&gt;&lt;/code&gt;My goodness, what a mouthful the Maven example is. There is a common acronym in the open source world called RTFM (read the *ing manual), when a user asks a question on a mailing list and the &quot;experts&quot; respond by pointing them to the place in the manual.
&lt;/p&gt;
&lt;p&gt;
I think Maven&apos;s biggest problems are 1) poor metadata in the central repository and 2) the source of metadata in projects (pom.xml).
&lt;/p&gt;
&lt;p&gt;
I believe #1 can be fixed if the Maven guys allow dependencies to be fixed based on user feedback. It&apos;s also gotten a lot better in recent years. In reality, maintaining transitive dependencies is hard and I believe Maven has done a good job. In reality, they&apos;re the only ones that slurp up transitive dependencies, so the only other option is to maintain the dependencies yourself.
&lt;/p&gt;
&lt;p&gt;
To fix #2, I think the problem is mainly XML and the verboseness of the elements-only pom.xml that Maven requires. Most of the contents of a pom.xml are either dependencies, plugins or exclusions/variances of Maven&apos;s conventions. What if Maven&apos;s metadata was pluggable? What if XML was only one option? What if you could write a pom.groovy and describe your entire build process in 5 lines instead of 500? &lt;em&gt;That&lt;/em&gt; would be very cool.&lt;/p&gt;
&lt;p&gt;I&apos;m still a Maven fan, mostly because it&apos;s greatly simplified the maintenance of and releasing of &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. When I do GWT, Seam or Grails development in the future, you can be sure I&apos;ll try to use Maven to do the development. Why? Because I&apos;ve learned how to use it and I don&apos;t feel the pain that so many others talk about. I also think it really shines on really large projects (builds that produce 30+ WARs for example). An Ant-based system on really large projects can become quite burdensome and difficult to maintain. Not only that, but it&apos;s very difficult to maintain a modular build system (where you can build/test/deploy a single WAR) with Ant. In my experience, really large Ant-based systems take forever to process that everything is up-to-date whereas Maven systems depend on each other and require you to keep them up to date. Sure it requires you to be smarter and run &quot;mvn install&quot; on your subprojects, but I&apos;d rather do that than wait 5 minutes for Ant to process everything just to run a test.
&lt;/p&gt;
&lt;p&gt;You might remember that the main reason I &lt;a href=&quot;http://raibledesigns.com/rd/entry/re_why_use_maven&quot;&gt;used to prefer Ant over Maven&lt;/a&gt; was speed. That was in Maven 1 days. With Maven 2, speed is no longer a problem and I&apos;ve found it much easier to run &quot;mvn jetty:run&quot; than &quot;ant deploy&quot; and wait for Tomcat to restart. IMO, the perfect development environment is one were you can run a command-line command (or use your IDE to start the server) and code away without worrying about restarts. Seam and Grails offer this environment, but it&apos;s unlikely your entire organization is going to use standardize on those frameworks and not have anything else. I think Maven and the Maven Jetty Plugin offer a nice alternative for the rest of those applications.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/rest_and_seam_talks_at</id>
        <title type="html">REST and Seam Talks at Denver&apos;s JUG</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/rest_and_seam_talks_at"/>
        <published>2008-01-09T20:59:45-07:00</published>
        <updated>2008-01-11T21:08:48-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="rest" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="seam" scheme="http://roller.apache.org/ns/tags/" />
        <category term="djug" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">After a long hiatus, I decided to attend the &lt;a href=&quot;http://www.denverjug.org&quot;&gt;Denver JUG&lt;/a&gt; meeting this evening. Tonight there&apos;s a couple of interesting talks:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Give It a REST by &lt;a href=&quot;http://zepheira.com/team/brian/&quot;&gt;Brian Sletten&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Seam by &lt;a href=&quot;http://members.capmac.org/~orb/blog.cgi&quot;&gt;Norman Richards&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;ll do my best to live-blog these sessions, so hopefully you can read along and learn everything I do. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Give It a REST by Brian Sletten&lt;/strong&gt;&lt;br/&gt;
This talk isn&apos;t an implementation talk, it&apos;s more of a motivational talk. Brian is trying to answer the question &quot;Why do we care?&quot;. We care because we have a lot of WS-Dissatisfaction. &quot;Conventional&quot; Web Services are often:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;too difficult for non-trivial tasks (real complexity)&lt;/li&gt;
&lt;li&gt;too complex for trivial tasks (artificial complexity)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
RPC-based Web Services are mythically interoperable and time/process coupled in painful ways. SOAP has largely become popular because of marketing dollars behind in. REST is more like the &quot;hippy&quot; way that has grass-roots support with no corporate sponsor.&lt;/p&gt;
&lt;p&gt;What makes SOAP difficult? It&apos;s remote procedure calls and its tunneled using existing application protocols (HTTP). Furthermore, there are no nouns (mappings to business terms), only handlers. There are no semantics, only handlers. When you tie yourself to a contract/WSDL, you can have anything back that you want - so as long as its simple XML. This isn&apos;t entirely true because a lot of things can be shoved into XML (Word documents that are Base64 encoded).&lt;/p&gt;
&lt;p&gt;The main problem with SOAP is it solves a problem that most people don&apos;t have. It solves an edge case, rather than the main problem.&lt;/p&gt;
&lt;p&gt;Many people say &quot;SOAP is secure and REST isn&apos;t&quot;.&lt;/p&gt;
&lt;p&gt;Why do people believe this? It&apos;s because of the long list of SOAP-related security acronyms: XML Encryption, XML Signature, XKMS, SAML, XACML, WS-Security, WS-Trust, XrML. Even if you&apos;re using these in your system, there&apos;s no proof that your implementation is secure. REST is what we all use on the web with online shopping, etc. We don&apos;t seem to have a problem with the security we use everyday on the web, do we?&lt;/p&gt;
&lt;p&gt;SAO is an architectural style promoting loose coupling among software participants. Sompanies have rigid definitions of what constitutes a SOA. Many believe that SOAP is an essential piece, but it&apos;s not. SOAP 1.2 and Doc Lit are improvements, but are they necessary? Interestingly, 85% of Amazon&apos;s users chose REST over SOAP when given the choice.&lt;/p&gt;
&lt;p&gt;What is REST? The acronym stands for &lt;strong&gt;RE&lt;/strong&gt;presentational &lt;strong&gt;S&lt;/strong&gt;tate &lt;strong&gt;T&lt;/strong&gt;ransfer. It&apos;s an architectural style based on certain constraints designed to elicit properties of scalability and extensibility. It&apos;s an idealized notion of how the early web should work and helped drive the way it eventually did work. It&apos;s more than just URLs!&lt;/p&gt;
&lt;p&gt;Resource-Oriented Computing focuses on information spaces, not code or objects. It focuses on logical connections and reduces complexity by separating actions from nouns. In the history of the web, we started with URLs that pointed to documents. Eventually, these documents became dynamic and were generated on-the-fly.&lt;/p&gt;
&lt;p&gt;URLs are locations on the web that are horrible names because they change so much. URIs are good names that have no way of being resolved. Fundamentally, REST is a separation of the parts of the system: Nouns, Verbs and Representation. A Resource (in a REST architecture) can be a file, a service or a concept. It can also have different representations. Resources are named with Resource Identifiers. It&apos;s simply the means of naming a resource. It&apos;s a standard syntax that allows various schemes. Often known as URIs (or IRIs). It&apos;s orthogonal to satisfying the reference and it&apos;s one of the missing pieces of &quot;normal&quot; web services.&lt;/p&gt;
&lt;p&gt;Examples of Representation include 1) a particular dereferencing of a Resource Identifier to a Resource at a particular time, 2) a byte-stream tagged with metadata or 3) it could change based on request or processing/display capabilities of the client (Firefox vs. WAP). &lt;/p&gt;
&lt;p&gt;REST&apos;s verbs are design decisions to minimize the the complexity of implementing a system. GET retrieves a resource and always returns the exact same result. It doesn&apos;t change anything in the backend system. Because of this, it allows for easier layering of your system - particularly when you introduce caching for GETs. POST is used to create (or update) a Resource. It does not require a &quot;known URI&quot; and it supports the append operation. PUT creates (or updates) a Resource, but requires a &quot;known URI&quot; and also supports an overwrite operation. Lastly, there is DELETE, which removes a Resource. This is not supported in modern browsers. Just because browsers don&apos;t support them doesn&apos;t mean you can&apos;t implement them in your applications.&lt;/p&gt;
&lt;p&gt;REST&apos;s concepts were developed by &lt;a href=&quot;http://en.wikipedia.org/wiki/Roy_Fielding&quot;&gt;Roy Fielding&lt;/a&gt; in his &lt;a href=&quot;http://tinyurl.com/cvamh&quot;&gt;thesis&lt;/a&gt;. He was trying to create a system that had the following architectural properties: performance, scalability, generality, simplicity and modifiability. REST allows us to create true client-server applications. To satisfy scalability requirements, REST is stateless. All parameters travel with the request and no session information is maintained on the server. This improves scalability through load-balancing and allows visibility of intermediary processors.&lt;/p&gt;
&lt;p&gt;One of the first things that becomes a bottleneck in enterprise systems is the database. This works fine if you like paying Oracle. By using REST and HTTP concepts, it&apos;s easy to take advantage of a cache. This allows replication of an external data set where it&apos;s too large to copy locally. REST allows you to create Layered Systems that allow you to have managed dependencies between layers. Having a RESTful architecture allows you to swap out the backend without changing the front-end and vise-versa.&lt;/p&gt;
&lt;p&gt;Now Brian is going to do some demos using &lt;a href=&quot;http://1060.org/&quot;&gt;NetKernel&lt;/a&gt;. He recommends using HTML documents to describe services. The beauty of developing a RESTful system is there&apos;s nothing preventing you from appending ?wsdl to your URLs to return SOAP.&lt;/p&gt;
&lt;p&gt;Invoking functionality using web-friendly techniques is a very nice way to build web applications.&lt;/p&gt;
&lt;p&gt;What is controversial in REST? &lt;a href=&quot;http://www.w3.org/DesignIssues/Axioms.html&quot;&gt;When you are not dereferencing you should not look at the contents of the URI string to gain other information.&lt;/a&gt;. However, if you structure your URLs in your application in a hierarchical manner, people &lt;em&gt;will&lt;/em&gt; be able to use URIs in this way.&lt;/p&gt;
&lt;p&gt;What isn&apos;t controversial? No one believes you should rely on sessions or other state at the application level. They also believe using nouns, not verbs is an excellent idea.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;&lt;strong&gt;Seam by Norman Richards&lt;/strong&gt;&lt;br/&gt;
Seam isn&apos;t just a web framework, it&apos;s an integration technology for building applications for the web. It&apos;s a technology that takes your persistence and web technologies and unifies them so you have a simpler view of your system. 
&lt;/p&gt;
&lt;p&gt;
First of all, what is Seam?
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;It&apos;s a unified component and event model - you access all your components the same way&lt;/li&gt;
&lt;li&gt;It has a declarative state with a rich context model&lt;/li&gt;
&lt;li&gt;It provides deep integration with minimal glue code&lt;/li&gt;
&lt;li&gt;It minimizes configuration, prefers annotations to XML&lt;/li&gt;
&lt;li&gt;It allows a freedom of architectures and technologies&lt;/li&gt;
&lt;li&gt;It also allows testing of components in context&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With Seam, you have a number of technology choices to make. The first is which business component model you want to use (EJB 3 vs. POJO). You might choose EJB 3 if you want more clustering capabilities. For persistence, you can use Hibernate or any JPA implementation. Norman recommends using JPA if possible. You also have a choice of languages: Java or Groovy (and possibly Scala in the future). Seam gives you a choice of web frameworks. All the examples today will use JSF, but there&apos;s also support for GWT and 2.1 will have support for Wicket. Also, there&apos;s some non-committers developing support for Flex. Norman believes component-based web frameworks are the best way to develop web applications. While I hear this from a lot of &lt;span style=&quot;text-decoration: line-through&quot;&gt;folks&lt;/span&gt; component-based framework authors, it seems ironic that the &quot;best&quot; way to develop webapps is not the most popular way (PHP, Struts, Rails).
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;I think it&apos;s ironic that there&apos;s a REST (no state) and a Seam (it&apos;s all about state) talk in the same night. I&apos;m tempted to ask why a stateful architecture is better than a REST one, but I&apos;m not really that interested in the answer. I think your architecture should be determined by the needs of your application, rather than choosing the architecture and then implementing an application with it.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;In addition to choices, Seam gives you a number of tools: CRUD generation, Eclipse and NetBeans support and full IDE support in JBoss Tools / JBoss Developer Studio.&lt;/p&gt;
&lt;p&gt;Now Norman is doing a demo - starting by creating a new Seam Web Project in Eclipse. He mentions that he&apos;s skipped a number of steps: downloading and installing Seam, downloading and installing JBoss and configuring your Seam installation and database in Eclipse. He has two projects in Eclipse - apparently the New Project wizard creates two - one for the application and one for testing. It&apos;s strange that the tests don&apos;t go in the actual project. The directory structure has &lt;code&gt;src/action&lt;/code&gt; and &lt;code&gt;src/model&lt;/code&gt; for your Seam components. After doing some simple CRUD, Norman starts JBoss and looks at the master/detail screens it generates.
&lt;/p&gt;
&lt;p&gt;To make a Java class a Seam component, you usually only have to add a @Name annotation to the class. While trying to show us how the Authenticator/login works, Norman tried to open components.xml. Unfortunately, this crashed Eclipse and 30 seconds later - following a bevy of &quot;file does not exist&quot; errors, we&apos;re back in action. To inject dependencies in a Seam environment, you use the @In annotation. In the example class, here&apos;s what the code looks like:
&lt;/p&gt;
&lt;pre&gt;
try {
  currentUser = (Person) entityManager.createQuery(&quot;select p from Person p where&quot; + 
       &quot; p.email = #{identity.username} and p.password=#{identity.password}&quot;).getSingleResult();
} catch (NoSuchEntityException e) {
  currentUser = null;
}
&lt;/pre&gt;
&lt;p&gt;This example appears to encourage title coupling with the data layer, rather than loose coupling (i.e. a DAO layer). I&apos;m sure Seam doesn&apos;t prevent you from developing a more loosely coupled application.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bug Alert:&lt;/strong&gt; The &amp;lt;h:messages&gt; tag looks like it always has an &amp;lt;li&amp;gt; - even when there&apos;s only one message. Struts 2 has the same issue with its &amp;lt;s:errors&amp;gt; tag. It&apos;s disappointing that so many Java framework developers don&apos;t have more attention to HTML details.&lt;/p&gt;
&lt;p&gt;Probably the coolest part of Norman&apos;s demo is how Eclipse auto-synchronizes with JBoss so he never has to start/stop anything when he changes Facelets pages or Java classes. Of course, hot deploy should be possible with any web application if you&apos;re using Eclipse Web Tools effectively.&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;I do believe all-in-one starter frameworks like Seam, Rails, Grails and AppFuse are excellent. However, I also believe they&apos;re solving a problem that only 10% of companies have. Most companies don&apos;t have the ability to start applications from scratch - unless they&apos;re a startup. Most companies have an existing infrastructure in place for the backend and they simply need a better web framework to slap a pretty face on it. I don&apos;t know the best solution for this, but it seems like a logical choice to RESTify the backend (possibly with a web framework) and then use a modern web framework for the front-end. IMHO, the best web frameworks for a RESTified backend are &lt;a href=&quot;http://www.adobe.com/products/flex/&quot;&gt;Flex&lt;/a&gt;, &lt;a href=&quot;http://code.google.com/webtoolkit/&quot;&gt;GWT&lt;/a&gt; and &lt;a href=&quot;http://www.appcelerator.org&quot;&gt;Appcelerator&lt;/a&gt;. If nothing else, these appear to be the most hyped for 2008.&lt;/p&gt;
&lt;p&gt;Many of the enhancements that Seam has added to the Java web programming model are being pushed back into the &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=299&quot;&gt;Web Beans JSR&lt;/a&gt;. With Seam, &lt;em&gt;injection&lt;/em&gt; is bi-directional (input and output), is continuous during application invocation and dis-injected after action is done. The whole purpose of this is to let Seam handle the state of your application. By not worrying about storing/maintaining state, you as a developer can concentrate on business logic more and get your applications done faster.
&lt;/p&gt;
&lt;p&gt;At this point, Norman started talking about Seam&apos;s events and how you can use them. Unfortunately, my battery ran out and I drifted off to do some other stuff. I&apos;m sure Seam&apos;s Event Model is pretty cool, I just missed it.
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_1_released</id>
        <title type="html">AppFuse 2.0.1 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_1_released"/>
        <published>2007-11-26T09:29:43-07:00</published>
        <updated>2007-11-26T16:51:27-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpa" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">The AppFuse Team is pleased to announce the release of AppFuse 2.0.1. This release squashes a number of bugs and includes an upgrade to Spring 2.5. To learn more about Spring 2.5&apos;s features, see InfoQ&apos;s &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.infoq.com/articles/spring-2.5-part-1&quot; rel=&quot;nofollow&quot;&gt;What&apos;s New in Spring 2.5: Part 1&lt;/a&gt;&lt;/span&gt; article.&lt;/p&gt;

&lt;p&gt;For information on upgrading from 2.0, see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0.1&quot; title=&quot;Release Notes 2.0.1&quot;&gt;2.0.1 Release Notes&lt;/a&gt; or &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0.1#ReleaseNotes2.0.1-changelog&quot;&gt;changelog&lt;/a&gt;. AppFuse 2.0.1 is available as a Maven archetype. For information on creating a new project using AppFuse, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot; title=&quot;Demos and Videos&quot;&gt;demos and videos&lt;/a&gt;. &lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
What is AppFuse? &lt;a href=&quot;?&quot; onclick=&quot;Effect.toggle(&apos;whatisappfuse&apos;, &apos;blind&apos;); return false&quot;&gt;Click here&lt;/a&gt; to find out.
&lt;/p&gt;
&lt;p style=&quot;display: none; border: 1px solid #F0C000;
 background-color: #FFFFCE;
 text-align:left;
 margin-top: 5px;
 margin-bottom: 5px; padding: 10px&quot; id=&quot;whatisappfuse&quot;&gt;
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; is an open source project and application that uses open source tools built on the Java platform to help you develop Web applications quickly and efficiently. It was originally developed to eliminate the ramp-up time found when building new web applications for customers. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project.
&lt;br/&gt;&lt;br/&gt;
AppFuse 1.x uses Ant to create your project, as well as build/test/deploy it. AppFuse 2.0 uses Maven 2 to create your project as well as build/test/deploy it. IDE support is much better in 2.0 because you can generate the IDE project files with Maven plugins. AppFuse 1.x uses XDoclet and JDK 1.4+.&lt;br/&gt;&lt;br/&gt;
This project was started in &lt;a href=&quot;http://raibledesigns.com/rd/entry/announce_struts_resume_and_appfuse&quot;&gt;April 2003&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;The 2.0 series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt;.  Join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. 

&lt;p&gt;Thanks to everyone for their help contributing code, writing documentation, posting to the mailing lists, and logging issues. &lt;/p&gt;

&lt;p&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot; rel=&quot;nofollow&quot;&gt;Atlassian&lt;/a&gt;&lt;/span&gt;, &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://contegix.com&quot; rel=&quot;nofollow&quot;&gt;Contegix&lt;/a&gt;&lt;/span&gt;, &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.jetbrains.com&quot; rel=&quot;nofollow&quot;&gt;JetBrains&lt;/a&gt;&lt;/span&gt;, and &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.java.net&quot; rel=&quot;nofollow&quot;&gt;Java.net&lt;/a&gt;&lt;/span&gt;. Atlassian and Contegix are especially awesome: &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot; rel=&quot;nofollow&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt;&lt;/span&gt; to the AppFuse project. Thanks guys - &lt;em&gt;you rock!&lt;/em&gt;&lt;/p&gt;

&lt;p class=&quot;smokey&quot;&gt;
Please post any issues you have with this release to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0.1-Released-tf4876194s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/comparing_web_frameworks_time_for</id>
        <title type="html">Comparing Web Frameworks: Time for a Change?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/comparing_web_frameworks_time_for"/>
        <published>2007-11-12T16:46:56-07:00</published>
        <updated>2007-11-12T23:56:11-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="comparison" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="seam" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">I first came up with the idea to do a &quot;Comparing Web Frameworks&quot; talk in 2004. I submitted a talk to ApacheCon and it got accepted. From there, I &lt;a href=&quot;http://raibledesigns.com/rd/entry/comparing_web_frameworks_presentation_outline&quot;&gt;outlined&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/comparing_web_frameworks_equinox_ant&quot;&gt;created sample apps&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/comparing_web_frameworks_presentation&quot;&gt;practiced&lt;/a&gt; this talk before ApacheCon. Believe it or not, that was my first time speaking in front of a large audience.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
&lt;strong&gt;Historical note:&lt;/strong&gt; October 2004 was a pretty cool month - I &lt;a href=&quot;http://raibledesigns.com/rd/entry/rails_the_mvc_framework_for&quot;&gt;discovered Rails&lt;/a&gt; and Roller had a &lt;a href=&quot;http://raibledesigns.com/rd/entry/upgraded_to_roller_1_0&quot;&gt;1.0 release candidate&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;When I created the presentation, it was in large part due to all the WebWork and Tapestry folks harassing me on this very blog. I started using Struts in June 2001 (the same month 1.0 was released) and had used it successfully on many projects. Part of the reason this blog became so popular was I posted lots of tips and tricks that I learned about Struts (and its related project) while using it. After a while, the noise became too heavy to ignore it - especially after I&apos;d tried Spring MVC. So in an effort to learn more about the the other frameworks, I submitted a talk and &lt;em&gt;forced&lt;/em&gt; myself to learn them. It seems to have worked out pretty well.
&lt;/p&gt;
&lt;p&gt;With that being said, I think it&apos;s time for a change. The reason I originally wrote this was to educate developers on how the top Java web frameworks differed and encourage developers to try more than one. A while later, I realized there&apos;s &lt;a href=&quot;http://raibledesigns.com/rd/entry/tssjs_bof_web_framework_sweet&quot;&gt;different tools for different jobs&lt;/a&gt; and it&apos;s not a one-size-fits-all web framework world. It&apos;s not a component vs. request-based framework world either. There&apos;s lots of options now. When I&apos;ve delivered this talk earlier this year, I&apos;ve always felt like I&apos;ve left quite a few frameworks out. The solution could be to add more and more frameworks. However, I don&apos;t think that&apos;s a good idea. The talk is already difficult to squeeze into 90 minutes and it&apos;s unlikely that adding more frameworks is going to help.
&lt;/p&gt;
&lt;p&gt;The change I&apos;d like to do is to reduce the number of frameworks down to (what I consider) the top web frameworks for deploying to the JVM. What are those frameworks? IMHO, they are as follows, in no particular order:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;GWT-Ext&lt;/li&gt;
&lt;li&gt;Wicket&lt;/li&gt;
&lt;li&gt;Grails&lt;/li&gt;
&lt;li&gt;Flex/OpenLaszlo&lt;/li&gt;
&lt;li&gt;Seam&lt;/li&gt;
&lt;li&gt;Struts 2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The RIFE, Tapestry and ZK folks can start bitching now. Sorry - less frameworks make for a more interesting talk. Maybe I&apos;ll add you in the future and I can ask the audience which ones they want compared then we can choose four and go from there. Why don&apos;t I mention Spring MVC? Because I think Struts 2 is easier to learn and be productive with and I also like it&apos;s more open and active community. I&apos;ve written applications with both and I like Struts 2 better. As for Flex vs. OpenLaszlo, I&apos;m somewhat torn. It seems like learning Flex is going to be better for your career, but it&apos;s likely useless without the Flex Builder - which is not open source. However, at $250, it&apos;s likely worth its price. I know the &lt;a href=&quot;http://www.picnik.com/&quot;&gt;Picnik&lt;/a&gt; folks used Flex for their UI - I wonder how much they used Flex Builder in the process?
&lt;/p&gt;
&lt;p&gt;What do you think? Are these the top web frameworks for JVM deployment today? The next time I give this talk is &lt;a href=&quot;http://us.apachecon.com/us2007/program/talk/1994&quot;&gt;this Thursday at ApacheCon&lt;/a&gt;. I may try to re-write my talk and then give the audience a choice of old vs. new. The downside of doing the new talk is I won&apos;t have time to write apps with GWT, Flex or Seam. Anyone care to post their top three pros and cons for any of these frameworks?</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/flex_and_grails_made_easy</id>
        <title type="html">Flex and Grails Made Easy</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/flex_and_grails_made_easy"/>
        <published>2007-11-01T23:00:38-06:00</published>
        <updated>2007-11-02T05:05:08-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="idea" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="flex" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">I love how easy it is to start new projects these days. It was very difficult when I started creating AppFuse way back in 2002. &lt;em&gt;We&apos;ve come a long way baby!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;Here&apos;s a couple of easy ways to get started with Flex and Grails:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://ancientprogramming.blogspot.com/2007/11/quickstart-flex-development-with-this.html&quot;&gt;Quickstart flex development with this maven archetype&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.codehaus.org/display/GRAILS/IDEA+Integration&quot;&gt;Grails development in IntelliJ IDEA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope to develop with Flex, Grails, GWT or YUI + Struts 2 in the next 6 months. These seem like the most exciting technologies for Java web development in 2008. </content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/introduction_to_grails_with_scott</id>
        <title type="html">Introduction to Grails with Scott Davis at the Colorado Software Summit</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/introduction_to_grails_with_scott"/>
        <published>2007-10-25T19:03:42-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="groovy" scheme="http://roller.apache.org/ns/tags/" />
        <category term="softwaresummit" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://grails.org&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/grails-logo-20070903.jpg&quot; alt=&quot;Grails&quot; width=&quot;280&quot; height=&quot;84&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;/&gt;&lt;/a&gt;
According to Scott, today&apos;s Java-based web frameworks are partial solutions at best. They&apos;re only solving one piece of the puzzle - you still need to manage persistence, deployment, etc. &lt;em&gt;all by yourself&lt;/em&gt;.
&lt;/p&gt;&lt;p&gt;
We&apos;re moving into a new era of web frameworks. The expectation now is a full-stack solution. Grails is a fully integrated modern Java web application in a box. It contains Spring, Hibernate, Quartz, Log4J, Jetty, HSQL, JUnit and Ant. You&apos;re not limited to using Jetty, you can type &quot;grails war&quot; and create a WAR that you can deploy to any application server. In a single zip/tar, you get the whole thing - including the database and servlet container. You get a lot of good default for free, but you&apos;re not limited to those defaults.
&lt;/p&gt;&lt;p&gt;
What does &quot;modern&quot; in a framework mean? It means it uses Convention over Configuration - Grails autowires components together based on naming conventions. Struts 1.x uses Configuration over Configuration - the more XML the better. 
&lt;/p&gt;&lt;p&gt;
The Wisdom of Crowds - why are the many smarter than the few? What is the wisdom of crowds when it comes to web frameworks. &lt;strong&gt;Struts&lt;/strong&gt; is the wisdom of crowds when it comes to web frameworks. It&apos;s based on sound principles (MVC) and was written by Craig McClanahan. He was the architect of &quot;Catalina&quot; Tomcat 4 and wrote Struts shortly thereafter. David Geary was contributor #2 to Struts. It has a proven track record and has a 60%-70% market share. Struts must be the perfect framework - especially since it has such a great pedigree.
&lt;/p&gt;&lt;p&gt;
So what&apos;s wrong with Struts? 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&apos;s 7 years old&lt;/li&gt;
&lt;li&gt;It&apos;s verbose and overly complex (reflective of the EJB 2.x era)&lt;/li&gt;
&lt;li&gt;Splintered community: Craig moved on to JSF -&gt; created Shale, then the WebWork merger&lt;/li&gt;
&lt;li&gt;While Struts 1.x was an unqualified success, Struts 2.x can&apos;t seem to build that critical mass - it can&apos;t seem to reach The Tipping Point like Struts 1.x did&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Recipe for a Tipping Point: Contagiousness / viral, tiny &quot;tweaks&quot; to a proven model can yield big, disproportionate effects, the rise is not &quot;slow and steady&quot; - the effect is dramatic and immediate.
&lt;/p&gt;&lt;p&gt;
Ruby on Rails won the hype award. It&apos;s largely worth the hype, but it&apos;s not revolutionary - it&apos;s &lt;em&gt;evolutionary&lt;/em&gt;. It has tiny tweaks to the proven MVC-driven approach: Convention over Configuration, Scaffolding and Unified Technology Stack. 
&lt;/p&gt;&lt;p&gt;
The one thing that Rails is lacking is Java support. Grails, on the other hand, offers the same experience using known, proven Java solutions.
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
Rails =&gt; &quot;replacement&quot;&lt;/li&gt;
&lt;li&gt;Grails =&gt; &quot;upgrade&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Scott drank the Rails Kool-Aid for a while and enjoyed it, but found it difficult to switch from Ruby in the morning to Java in the afternoon. With Grails, he doesn&apos;t have to do as much context switching, as well as all the Java libraries are available - the ones you know and love.
&lt;/p&gt;&lt;p&gt;
You can drop groovy.jar into your classpath and write Groovy code. One nice thing about Groovy is you can rename your existing .java files to .groovy and they&apos;ll work just fine. Included Ajax support: Script.aculo.us and Protoype as well as YUI. YUI is battle-tested since it&apos;s used by Yahoo and very well documented.  You can use &quot;grails install-dojo&quot; to install the Dojo toolkit. Grails has a wealth of plugins available at &lt;a href=&quot;http://grails.org/plugins&quot;&gt;http://grails.org/plugins&lt;/a&gt;. 
&lt;/p&gt;&lt;p&gt;
Now we&apos;re going to crack our nuckles and build some code - slides are over.

&lt;pre&gt;
 grails create-app conference
 cd conference
 grails create-domain-class Speaker (add some fields)
 grails generate-all Speaker
 grails run-app
&lt;/pre&gt;
&lt;p&gt;The impressive things about this set of commands is I was able to 1) download Grails and 2) run all these commands at the same time that Scott did. I was definitely impressed (I knew I would be).

Auto-scaffolding - you can get the same thing as &quot;generate-all&quot;, but it generates controllers and views at runtime &lt;em&gt;in-memory&lt;/em&gt;. All you need to do is create a domain object (i.e. Talk) and then create a TalkController that has the following line in it:
&lt;/p&gt;
&lt;pre&gt;
def scaffold = Talk
&lt;/pre&gt;
&lt;p&gt;As a test, I tried this at the same time that Scott did and got the following error. It looks like Grails/Jetty isn&apos;t smart enough to pick up new classes as they&apos;re added. 
&lt;/p&gt;
&lt;pre&gt;
[263102] commons.DefaultGrailsApplication Class not found attempting to load class Talk
java.lang.ClassNotFoundException: Talk
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
&lt;/pre&gt;
&lt;p&gt;Grails comes with a number of environments. &lt;strong&gt;Dev&lt;/strong&gt; (the default) auto-reloads changes to Controllers, Views and even the Model (this is helpful for rapid development). &lt;strong&gt;Prod&lt;/strong&gt; loads all items statically for maximum performance. To change the environments - you can change DataSource.groovy.
&lt;/p&gt;
&lt;p&gt;For some reason, adding/removing some properties on my Talk object and my application hasn&apos;t been the same since. Now when I try to access my TalkController, I see the following stack trace:
&lt;/p&gt;
&lt;pre&gt;
org.springframework.orm.hibernate3.HibernateQueryException: could not resolve property: difficulty of: Talk; nested exception is org.hibernate.QueryException: could not resolve property: difficulty of: Talk
	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:640)
	at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
	at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:378)
	at org.springframework.orm.hibernate3.HibernateTemplate.executeFind(HibernateTemplate.java:342)
	at org.codehaus.groovy.grails.scaffolding.DefaultScaffoldDomain.list(DefaultScaffoldDomain.java:112)
&lt;/pre&gt;
&lt;p&gt;I asked Scott about this error and he proved that removing properties from domain objects should work. I told him restarting Jetty didn&apos;t fix the problem and he suggested dropping the &quot;Talk&quot; table and letting Grails re-create it. Unfortunately, I have no idea where this database is, so that&apos;s difficult to do. Doh - now I realize what was causing the problem. Before I dropped the &quot;difficulty&quot; property, I had clicked on the column and that property was still referenced in the URL. When I&apos;d refresh the browser, the stack trace occurred. I don&apos;t know if I&apos;d consider this a bug or not.
&lt;/p&gt;
&lt;p&gt;
dbCreate = hibernate.hbm2ddl.auto is used. When in development &lt;strong&gt;create-drop&lt;/strong&gt; is used. In production and test environments, it uses &lt;strong&gt;update&lt;/strong&gt; and saves the data between restarts.
&lt;/p&gt;
&lt;p&gt;
You can turn off Hibernate&apos;s automatic schema alteration by commenting out &quot;dbCreate&quot; line in DataSource.groovy. 
&lt;/p&gt;
&lt;p&gt;To run your application in Tomcat instead of Jetty, you can run &quot;grails war&quot; and copy the WAR to Tomcat. The WAR is created with the production environment by default, so you may need to pass in arguments or set environment variables if you want the WAR created in dev mode.
&lt;/p&gt;
&lt;p&gt;At this point, my battery died. Scott continued to cover how to order form elements (when using scaffolding) with &quot;static constraints&quot; and how to add validation rules. It was an excellent presentation and Grails definitely looks like a really cool web framework. The best part is I learned most of what you need to know to use it - in an hour!
&lt;/p&gt;
&lt;p&gt;
I might have to try Grails soon - I love the concept of &lt;a href=&quot;http://www.theserverside.com/news/thread.tss?thread_id=47213&quot;&gt;Life above the Service Tier&lt;/a&gt; and Grails would work nicely for serving up &lt;a href=&quot;http://grails.codehaus.org/REST+plugin&quot;&gt;REST&lt;/a&gt;. I think YUI, GWT-Ext and Flex are probably the best frameworks for developing a SOFEA client. The question is - when using YUI, how do you download all pages in the application at once?</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/maven_meetup_in_san_francisco</id>
        <title type="html">Maven Meetup in San Francisco tomorrow (Tuesday)</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/maven_meetup_in_san_francisco"/>
        <published>2007-10-08T22:55:41-06:00</published>
        <updated>2007-10-09T04:56:07-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="meetup" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">If you live in the Bay Area and you&apos;re interested in talking with the inventors of Maven and/or XWiki, you should checkout the &lt;a href=&quot;http://blogs.codehaus.org/people/vmassol/archives/001618_xwiki_maven_meetup.html&quot;&gt;XWiki + Maven meetup&lt;/a&gt; at Terracotta&apos;s HQ. Java Open Source gurus Vincent Massol and Jason van Zyl will be there - sounds like a fun event!</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_released</id>
        <title type="html">AppFuse 2.0 Released!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_released"/>
        <published>2007-09-18T15:22:20-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpa" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
I&apos;m extremely happy to announce we&apos;ve finally finished developing AppFuse 2.0. The road to AppFuse 2.0 has been a long journey through Mavenland, annotations and generics. Thanks to all the developers, contributors and users for helping test, polish and prove that AppFuse 2 is an excellent solution for developing Java-based applications. Your time, patience and usage of AppFuse has made it the strong foundation it is today. Last but certainly not least, thanks to all the great Java developers who wrote the frameworks that AppFuse uses - we&apos;re truly standing on the shoulders of giants.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
What is AppFuse? &lt;a href=&quot;?&quot; onclick=&quot;Effect.toggle(&apos;whatisappfuse&apos;, &apos;blind&apos;); return false&quot;&gt;Click here&lt;/a&gt; to find out.
&lt;/p&gt;
&lt;p style=&quot;display: none; border: 1px solid #F0C000;
 background-color: #FFFFCE;
 text-align:left;
 margin-top: 5px;
 margin-bottom: 5px; padding: 10px&quot; id=&quot;whatisappfuse&quot;&gt;
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; is an open source project and application that uses open source tools built on the Java platform to help you develop Web applications quickly and efficiently. It was originally developed to eliminate the ramp-up time found when building new web applications for customers. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project.
&lt;br/&gt;&lt;br/&gt;
AppFuse 1.x uses Ant to create your project, as well as build/test/deploy it. AppFuse 2.0 uses Maven 2 to create your project as well as build/test/deploy it. IDE support is much better in 2.0 because you can generate the IDE project files with Maven plugins. AppFuse 1.x uses XDoclet and JDK 1.4+.&lt;br/&gt;&lt;br/&gt;
This project was started in &lt;a href=&quot;http://raibledesigns.com/rd/entry/announce_struts_resume_and_appfuse&quot;&gt;April 2003&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;AppFuse 2.0 is available as a Maven archetype. For information on creating a new project using this release, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot;&gt;demos and videos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll might want to read our &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;Frequently Asked Questions&lt;/a&gt;.  If you have any questions or issues, please post them to the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt;. The &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2&quot; title=&quot;Maven 2&quot;&gt;Maven Reference Guide&lt;/a&gt; has a map of Ant &amp;raquo; Maven commands. &lt;a href=&quot;http://appfuse.org/display/APF/Maven+for+Newbies&quot; title=&quot;Maven for Newbies&quot;&gt;Maven for Newbies&lt;/a&gt; might also be useful if you&apos;ve never used Maven before. There is &lt;a href=&quot;http://appfuse.org/display/APF/FAQ#FAQ-usingant&quot;&gt;some support for Ant&lt;/a&gt; in this release.&lt;/p&gt;

&lt;p&gt;AppFuse 2.0 contains over 200 pages of &lt;a href=&quot;http://appfuse.org&quot;&gt;documentation&lt;/a&gt;, downloadable as a &lt;a href=&quot;https://appfuse.dev.java.net/files/documents/1397/68818/appfuse-documentation-2.0.pdf&quot;&gt;PDF&lt;/a&gt; (3 MB). You can also download all its &lt;a href=&quot;https://appfuse.dev.java.net/files/documents/1397/68819/appfuse-dependencies-2.0.zip&quot;&gt;dependencies&lt;/a&gt; and install them in your local repository if you want to work offline.&lt;/p&gt;

&lt;p&gt;For more information, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0&quot; title=&quot;Release Notes 2.0&quot;&gt;2.0 Release Notes&lt;/a&gt;. The 2.0 series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;New features in AppFuse 2.0 include:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Maven 2 Integration&lt;/li&gt;
	&lt;li&gt;Upgraded WebWork to Struts 2&lt;/li&gt;
	&lt;li&gt;JDK 5, Annotations, JSP 2.0, Servlet 2.4&lt;/li&gt;
	&lt;li&gt;JPA Support&lt;/li&gt;
	&lt;li&gt;Generic CRUD backend&lt;/li&gt;

	&lt;li&gt;Full Eclipse, IDEA and NetBeans support&lt;/li&gt;
	&lt;li&gt;Fast startup and no deploy with Maven Jetty Plugin&lt;/li&gt;
	&lt;li&gt;Testable on multiple appservers and databases with Cargo and profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We appreciate the time and effort everyone has put toward contributing code and documentation, posting to the mailing lists, and logging issues. &lt;/p&gt;

&lt;p&gt;We&apos;re also grateful for the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt;, &lt;a href=&quot;http://www.jetbrains.com&quot;&gt;JetBrains&lt;/a&gt;, and &lt;a href=&quot;http://www.java.net&quot;&gt;Java.net&lt;/a&gt;. Atlassian and Contegix are especially awesome: &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project. Thanks guys - &lt;em&gt;you rock!&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
Comments and issues should be posted to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0-Released%21-tf4477191s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_rc1_released</id>
        <title type="html">AppFuse 2.0 RC1 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_rc1_released"/>
        <published>2007-09-04T01:42:15-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.0 RC1! This release marks a huge step in the march to releasing AppFuse 2.0. This release puts the finishing touches on the &lt;a href=&quot;http://static.appfuse.org/plugins/appfuse-maven-plugin&quot;&gt;AppFuse Maven Plugin&lt;/a&gt; (AMP), which offers CRUD generation, as well as the ability to change AppFuse from &quot;embedded mode&quot; to &quot;full source&quot; (like 1.x). In addition, we&apos;ve addressed over 100 issues in preparation for the final 2.0 release. We hope to fix any bugs related to this release and release 2.0 Final in the next week or two.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot; title=&quot;Demos and Videos&quot;&gt;videos&lt;/a&gt; still represent how M5 works, but things have been simplified (now you don&apos;t need to run &lt;em&gt;appfuse:install&lt;/em&gt; after &lt;em&gt;appfuse:gen&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;AppFuse 2.0 is available as a Maven archetype. For information on creating a new project using this release, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://static.appfuse.org/movies/2.0/helloworld.mov&quot;&gt;Hello World video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt;.  Join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. The &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2&quot; title=&quot;Maven 2&quot;&gt;Maven Reference Guide&lt;/a&gt; has a map of Ant &amp;raquo; Maven commands. &lt;a href=&quot;http://appfuse.org/display/APF/Maven+for+Newbies&quot; title=&quot;Maven for Newbies&quot;&gt;Maven for Newbies&lt;/a&gt; might also be useful if you&apos;ve never used Maven before. There is &lt;a href=&quot;http://appfuse.org/display/APF/FAQ#FAQ-usingant&quot;&gt;some support for Ant&lt;/a&gt; in this release.&lt;/p&gt;

&lt;p&gt;For more information, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0+RC1&quot; title=&quot;Release Notes 2.0 RC1&quot;&gt;2.0 RC1 Release Notes&lt;/a&gt;. The 2.0 series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;We appreciate the time and effort everyone has put toward contributing code and documentation, posting to the mailing lists, and logging issues. &lt;/p&gt;

&lt;p&gt;We also greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt;, &lt;a href=&quot;http://www.jetbrains.com&quot;&gt;JetBrains&lt;/a&gt;, and &lt;a href=&quot;http://www.java.net&quot;&gt;Java.net&lt;/a&gt;. Atlassian and Contegix are especially awesome: &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project. Thanks guys - &lt;em&gt;you rock!&lt;/em&gt;
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
Comments and issues should be posted to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0-RC1-Released%21-tf4376078s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I&apos;ve uploaded a &lt;a href=&quot;http://tinyurl.com/2qlst4&quot;&gt;247-page PDF version of the RC1 documentation&lt;/a&gt; to java.net. This PDF contains the relevant pages from the wiki that help you develop with AppFuse 2.0. Who knew I&apos;d end up writing another book? &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/want_a_kick_ass_java</id>
        <title type="html">Want a kick-ass Java/UI Engineering Job in Mountain View?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/want_a_kick_ass_java"/>
        <published>2007-08-17T10:24:00-06:00</published>
        <updated>2007-08-17T16:24:00-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="job" scheme="http://roller.apache.org/ns/tags/" />
        <category term="linkedin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">The last month working at &lt;a href=&quot;http://linkedin.com&quot;&gt;LinkedIn&lt;/a&gt; has been an absolute blast. I&apos;m new to the whole &quot;treating developers like royalty&quot; thing, so that&apos;s taken a while to get used to. It&apos;s definitely nice, especially when the company gives you ownership of the things you&apos;re working on. Sure, there&apos;s schedules and priorities, but it seems like each and every engineer has control of their own destiny. As a consultant, I&apos;ve been very impressed with the way I&apos;ve been embraced and folded into the team like a regular employee. There&apos;s lots of team lunches, a tech meetup every now and then, and I even played hoops with a bunch of guys last night. This is probably the coolest company I&apos;ve ever worked for.
&lt;/p&gt;
&lt;p&gt;Wanna have fun like I am? LinkedIn is looking to hire quite aggressively over the next several months. There&apos;s new faces almost every week and hopefully I can &quot;hook you up&quot; to be a part of the festivities. Below is a position that we&apos;re currently hiring for in the UI Engineering team. Working remotely is not an option at this time, you need to live in (or relocate to) the Bay Area.
&lt;/p&gt;
&lt;div class=&quot;smokey&quot; style=&quot;margin-left: 0; padding-bottom: 0; margin-bottom: 10px&quot;&gt;LinkedIn is an online network of more than 11 million experienced
professionals from around the world, representing 150 industries. We are
four years old, profitable and one of the fastest growing pre-IPO Web 2.0
companies in Silicon Valley.
&lt;br/&gt;&lt;br/&gt;
LinkedIn is developing the UI infrastructure for our next generation
applications.  This is a strategic initiative that will enable LinkedIn to
develop highly interactive and intuitive applications leveraging the latest
Web UI technologies. We are looking for a world-class software engineer to
work on this critical component of our infrastructure, in partnership with
one or more technical leads, the engineering and the product team.
&lt;br/&gt;&lt;br/&gt;
POSITION REQUIREMENTS:
&lt;ul class=&quot;glassList&quot; style=&quot;padding-bottom: 0; margin-bottom: 0&quot;&gt;
&lt;li&gt;EXPERIENCE:
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;&lt;li&gt;3+ years of overall professional work experience&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
SKILLS &amp; ABILITIES:
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;
&lt;li&gt;In depth and hands on knowledge of Java, the J2EE platform and
experience working with relevant tools (IDEs, ant, junit, etc.)&lt;/li&gt;
&lt;li&gt;A passion for UI frameworks: JSF and Facelets experience preferable.&lt;/li&gt;
&lt;li&gt;In depth knowledge of JSP, JSTL.&lt;/li&gt;
&lt;li&gt;Experience with Ajax.&lt;/li&gt;
&lt;li&gt;Experience with portal technologies.&lt;/li&gt;
&lt;li&gt;I18n experience a plus.&lt;/li&gt;
&lt;li&gt;Solid understanding of design, coding and testing patterns&lt;/li&gt;
&lt;li&gt;Ability to work in a fast paced, test-driven collaborative and
iterative programming environment&lt;/li&gt;
&lt;li&gt;Ability to effectively interact with product managers and other
organizational units such as QA and CS&lt;/li&gt;
&lt;li&gt;Excellent communication skills&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
EDUCATION:
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;&lt;li&gt;B.S./M.S in Computer Science or equivalent experience.&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;I don&apos;t know if JSF and Facelets experience is still a requirement (now that I&apos;m here &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;), but a passion for UI frameworks and web development is. You should know &lt;strong&gt;at least two&lt;/strong&gt; leading Java frameworks and have a lot of experiencing with testing web applications out-of-container. We&apos;re not looking for Java Developers turned web developers, we&apos;re more looking for Web Developers that know Java.
&lt;/p&gt;
&lt;p&gt;If this sounds interesting to you, shoot me your resume in an &lt;a href=&quot;mailto:mraible@linkedin.com?Subject=Java/UI Developer at LinkedIn&quot;&gt;e-mail&lt;/a&gt;. Don&apos;t forget to include a link to your LinkedIn Profile.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/live_coding_for_4_days</id>
        <title type="html">Live Coding for 4 Days Straight</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/live_coding_for_4_days"/>
        <published>2007-05-24T13:50:30-06:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="selenium" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="dbunit" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ant" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last week I had an interesting 4-day consulting gig for a client in Boulder.  I was supposed to fly out to Connecticut to deliver a training course, but it got rescheduled due to the 45-day Vendor Approval Process I need to go through. The client in Boulder wanted me to come out and do an architectural assessment and provide recommendations. Topics they were interested in: web tier (specifically Spring MVC), Security, Ajax integration, build process, web services and localization. I&apos;ve done this kind of before with Virtuas, but this time was different. With Virtuas, I&apos;d do 5-days worth of presentations on just about anything the customer wanted. For example, checkout &lt;a href=&quot;http://static.raibledesigns.com/repository/text/JavaWebTechnologiesAgenda.pdf&quot;&gt;this agenda&lt;/a&gt; for a client in NY last year.
&lt;br/&gt;&lt;br/&gt;
With the company in Boulder, I delivered zero presentations. Instead, everything we talked about and coded was hands-on. On Tuesday, we started out by discussing their application and some issues they were having. They&apos;d done a lot of customization to Spring MVC and had managed to eliminate all the XML needed when adding new controllers and views. I spent 3-4 hours that day with 2 of their engineers finalizing and implementing their convention-over-configuration rules. On Wednesday, I helped them implement Acegi Security into their application.  This was interesting because they didn&apos;t have any security mechanism and we had to implement Acegi from scratch and then tie it into their backend (using a custom AuthenticationProvider).  We also integrated i18n so all messages were retrieved from their database.
&lt;br/&gt;&lt;br/&gt;
On Thursday, we configured Ant to run their tests and wrote some tests for their controllers. As part of this process, I showed them how to use jMock and EasyMock and tried to explain the benefits of using Spring IoC (which they still aren&apos;t sold on). On Friday, we integrated Selenium into their build process and wrote a few tests using Selenium&apos;s Java support. In the afternoon, I showed them how they might use Scriptaculous and Prototype to Ajax-enable some features in their application.
&lt;br/&gt;&lt;br/&gt;
Doing all the &quot;live coding&quot; on someone else&apos;s machine (with 5 developer&apos;s watching) was a bit nerve wracking. However, thanks to Cenqua&apos;s &lt;a href=&quot;http://www.cenqua.com/fisheye/&quot;&gt;FishEye&lt;/a&gt; tool, I was able to search &lt;a href=&quot;http://fisheye4.cenqua.com/browse/appfuse&quot;&gt;AppFuse&lt;/a&gt; and &lt;a href=&quot;http://fisheye4.cenqua.com/browse/appfuse-light&quot;&gt;AppFuse Light&apos;s&lt;/a&gt; SVN repositories for code snippets and examples. While I knew how to do much of the stuff we covered, FishEye and Google bailed me out when I didn&apos;t. About halfway through, I realized that I don&apos;t keep a lot of my knowledge in my head. Instead, it&apos;s on this blog, or spread out on the web. I don&apos;t remember URLs anymore, all I remember are keywords. If I&apos;ve read a blog post or article on the web, chances are I can find it again pretty easily with Google. Even though I store a lot of bookmarks in del.icio.us, I didn&apos;t use it all week. Remembering keywords is the new bookmark for me.
&lt;br/&gt;&lt;br/&gt;
The whole week was an interesting exercise in &quot;live coding.&quot; The whole team (6 or so) sat in a conference room all week and VNC&apos;ed into the architect&apos;s box to do the work. We worked in Eclipse and used WTP to deploy/test things on Tomcat. The keyboard was passed around between developers at random and everyone got a chance to implement new features. I think the reason that everything worked so well was because the team was full of Senior Java Developers. Everyone learned from each other as they saw new shortcuts, keystrokes and ways or writing code. I don&apos;t know if this kind of thing will work in all development teams, but I&apos;d encourage you to try it. It&apos;s a great way to share knowledge and educate the entire team on how a new module works.
&lt;br/&gt;&lt;br/&gt;
Over the weekend, I received the following e-mail from one of the developers on the team:&lt;/p&gt;
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Very nice to meet you this past week and get a chance to see firsthand the breadth and depth of your experience in web app frameworks and such. I believe due to your visit, we will be cranking happily along here very shortly. Everyone was quite happy with the results at the end of the day yesterday.
&lt;/p&gt;
&lt;p&gt;
On a related note, if you&apos;re looking to hire an enthusiastic Web + Java Developer, please take a look at &lt;a href=&quot;http://raibledesigns.com/resume.jsp&quot;&gt;my resume&lt;/a&gt; or &lt;a href=&quot;http://raibledesigns.com/contact.jsp&quot;&gt;send me an e-mail&lt;/a&gt;. My current contract ends this month and I&apos;m hoping to find something new to get me through the summer.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_m5_released</id>
        <title type="html">AppFuse 2.0 M5 Released - now with CRUD generation and XFire support</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_m5_released"/>
        <published>2007-05-23T17:49:10-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.0 M5! 
This release marks a milestone in the features of AppFuse 2.x. This release adds CRUD code generation, full source support (just like 1.x) and XFire integration. In addition, we&apos;ve fixed all the issues related to switching persistence frameworks, and you should now be able to easily switch from using Hibernate to to iBATIS or JPA. The &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot; title=&quot;Demos and Videos&quot;&gt;videos&lt;/a&gt; have been updated for M5. The &lt;a href=&quot;http://static.appfuse.org/movies/2.0/struts2-crud.mov&quot; title=&quot;14.2 MB, 6 minutes 6 seconds&quot;&gt;Easy CRUD with Struts 2 video&lt;/a&gt; shows how code generation currently works.&lt;/p&gt;

&lt;p&gt;AppFuse 2.0 is available as a Maven archetype. For information on creating a new project using this release, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://static.appfuse.org/movies/2.0/helloworld.mov&quot; title=&quot;13.2 MB, 6 minutes 14 seconds&quot;&gt;Hello World video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt; and join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. The &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2&quot; title=&quot;Maven 2&quot;&gt;Maven Reference Guide&lt;/a&gt; has a map of &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2#Maven2-Antvs.Maven&quot;&gt;Ant &amp;raquo; Maven commands&lt;/a&gt;. &lt;a href=&quot;http://appfuse.org/display/APF/Maven+for+Newbies&quot; title=&quot;Maven for Newbies&quot;&gt;Maven for Newbies&lt;/a&gt; might also be useful if you&apos;ve never used Maven before. There is &lt;a href=&quot;http://appfuse.org/display/APF/FAQ#FAQ-usingant&quot;&gt;some support for Ant&lt;/a&gt; in this release.&lt;/p&gt;

&lt;p&gt;For more information, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0+M5&quot; title=&quot;Release Notes 2.0 M5&quot;&gt;2.0 M5 Release Notes&lt;/a&gt;. If you&apos;d like to use AppFuse offline (or download everything at once), you may want to &lt;a href=&quot;https://appfuse.dev.java.net/servlets/ProjectDocumentList?folderID=7516&quot;&gt;grab the dependencies&lt;/a&gt; and extract them into your ~/.m2/repository directory.&lt;/p&gt;

&lt;p&gt;The 2.0 series of AppFuse has a minumum requirement of the following specification versions:&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;Java Servlet 2.4 and JavaServer Pages (JSP) 2.0&lt;/li&gt;
	&lt;li&gt;Java 5 for Development (Java 1.4 for deployment using the &lt;a href=&quot;http://mojo.codehaus.org/retrotranslator-maven-plugin/examples/project-translation.html&quot;&gt;Retrotranslator Plugin&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;smokey&quot;&gt;
Comments and issues should be posted to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0-M5-Released%21-tf3807216s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We appreciate the time and effort everyone has put toward contributing code and documentation, posting to the mailing lists, and logging issues. We also greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://cenqua.com/&quot;&gt;Cenqua&lt;/a&gt;, &lt;a href=&quot;http://contegix.com/&quot;&gt;Contegix&lt;/a&gt;, &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt;, &lt;a href=&quot;http://www.java.net&quot;&gt;Java.net&lt;/a&gt; and &lt;a href=&quot;http://kgbinternet.com/&quot;&gt;KGBInternet&lt;/a&gt;.  Without them, working on this project wouldn&apos;t be nearly as much fun.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The videos are much lower quality than the ones I originally recorded (13 MB vs. 70 MB). If you want to view the high quality videos (they&apos;re much clearer), you can &lt;a href=&quot;https://appfuse.dev.java.net/files/documents/1397/58384/appfuse-2.0-videos.zip&quot;&gt;download them from java.net&lt;/a&gt;. If someone has a better way to compress these (I just used QuickTime&apos;s Export feature), please let me know.&lt;/p&gt;
&lt;p&gt;Also, this release contains the first release of the &lt;a href=&quot;http://static.appfuse.org/plugins/appfuse-maven-plugin&quot;&gt;AppFuse Maven Plugin&lt;/a&gt;. This plugin is largely based on &lt;a href=&quot;http://tools.hibernate.org&quot;&gt;Hibernate Tools&lt;/a&gt;. We modified many of the FreeMarker templates from Hibernate Tools to default to certain annotations, as well as clean up the formatting. These templates are currently available in &lt;a href=&quot;http://fisheye4.cenqua.com/browse/appfuse/trunk/plugins/appfuse-maven-plugin/src/main/resources/appfuse/model&quot;&gt;AppFuse&apos;s SVN&lt;/a&gt;. Hopefully making them available is enough to satisfy Hibernate&apos;s LGPL license.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/help_me_help_you_market</id>
        <title type="html">Help me help you (market your web framework)</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/help_me_help_you_market"/>
        <published>2007-04-26T13:58:30-06:00</published>
        <updated>2007-04-27T08:45:59-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Rather than trolling through google searches, mailing list archives and Amazon book searches, I&apos;d like to try something new. For those projects represented in my Comparing Java Web Frameworks talks (MyFaces, Spring MVC, Stripes, Struts 2, Tapestry and Wicket), would you be interested in helping me gather statistics? I think by allowing projects to gather their own statistics, we&apos;ll get a more accurate number of their statistics.  Here&apos;s the questions I need you to answer:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How many tools (i.e. IDE plugins) are available for your web framework?&lt;/li&gt;
&lt;li&gt;How many jobs are available for your framework on &lt;a href=&quot;http://www.dice.com&quot;&gt;Dice.com&lt;/a&gt;? What about &lt;a href=&quot;http://indeed.com&quot;&gt;Indeed.com&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;How many messages where posted to your &lt;strong&gt;user&lt;/strong&gt; mailing list (or forum) in March 2007?&lt;/li&gt;
&lt;li&gt;How many books are available for your framework?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Of course, if you don&apos;t have time, I&apos;ll be more than happy to gather these statistics myself. However, those that do answer might get some extra marketing love during my talk. Answering in a comment or &lt;a href=&quot;http://raibledesigns.com/contact.jsp&quot;&gt;sending me an e-mail&lt;/a&gt; are the best ways to provide your findings. &lt;em&gt;Thanks!&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;
&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href=&quot;http://herebebeasties.com/2007-04-27/lies-damned-lies-and-statistics/&quot;&gt;Alastair&lt;/a&gt; asks for further clarification. Here goes:&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&gt; If you have lots of IDE tooling available, it probably means the configuration for the framework is overly complex and unmanageable without tooling.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;
While this may be true, if your framework is &lt;a href=&quot;http://code.google.com/webtoolkit/&quot;&gt;hot&lt;/a&gt; or &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;uber productive&lt;/a&gt;, people want tools. Especially new developers. Remember there&apos;s a plethora of new Java developers every year and a lot of them prefer tool-based solutions. Good or bad, IDEs are nice and people like to use them. I&apos;ve had many clients dismiss frameworks simply because no tools were available.
&lt;/p&gt;&lt;p&gt;
&lt;em&gt;&gt; The framework with the largest number of jobs available is probably Struts 1. Enough said.&lt;/em&gt;
&lt;/p&gt;&lt;p&gt;
Yes, you&apos;re definitely right. However, Struts 1 is not in this comparison - I dropped it because I don&apos;t want to recommend it to anyone.
&lt;/p&gt;&lt;p&gt;
&lt;em&gt;&gt; People only post to user lists when they are stuck. If the framework is hard to use, there will be lots of e-mails. If it has a steep learning curve, and/or the documentation is poor, this will be particularly so. On the other hand, an active list might point to a large active user base. Who knows which is which from a raw figure?&lt;/em&gt;
&lt;/p&gt;&lt;p&gt;
What about community? Mailing lists and their activity is a sign of an active community. Even though SiteMesh is a mature and good solution, its community sucks. There&apos;s little support, no new features, no bug fixes. An open source project w/o a community is tough for a company to adopt. Also, the best communities do a lot more than answer questions on mailing lists. They develop their applications, get advice, offer advice and sometimes even &lt;em&gt;hang out&lt;/em&gt;. The Struts list used to have threads 30-50 messages long about development philosophies. When you joined the mailing list, you felt like you were a part of something, not just a user of a product.
&lt;/p&gt;&lt;p&gt;
&lt;em&gt;&gt; If your framework is fairly stable, and someone has written a fabulous tome on it that is universally acknowledged as &quot;the bible&quot;, few people would bother writing another book for it.&lt;/em&gt;
&lt;/p&gt;&lt;p&gt;
I don&apos;t agree - this just means there&apos;s no market for other books because not that many people are using it. Look at Grails, Groovy, GWT and Rails - there&apos;s been quite a few books on each and no slowdown in sight. Then again, there weren&apos;t many Ant books and that was/is hugely popular. I&apos;m willing to change this question to &quot;How many &lt;strong&gt;good&lt;/strong&gt; does your framework have?&quot;, but that&apos;s up to everyone&apos;s own interpretation. Again, lots of books means there&apos;s an active community outside the immediate mailing list - it&apos;s a sign the general &quot;market&quot; is interested and the framework fills a need.
&lt;/p&gt;&lt;p&gt;
Of course, I &lt;strong&gt;am&lt;/strong&gt; interested in asking the questions that developers want to see answered.  Do you have suggestions for replacement (or new) questions? Remember, people like hard facts, not wishy washy statements about how productive and OO your framework is. Every framework can be uber productive if you have the right developer(s) and they&apos;re genuinely interested in getting stuff done.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/what_web_framework_are_you</id>
        <title type="html">What web framework are you using with AppFuse?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/what_web_framework_are_you"/>
        <published>2007-04-25T11:05:04-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webwork" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">As part of my upcoming &lt;a href=&quot;http://www.eu.apachecon.com/program/talk/75&quot;&gt;Comparing Java Web Frameworks&lt;/a&gt; talk, I&apos;d like to show some statistics of web framework usage in AppFuse. Please vote for the one you&apos;re using by clicking on the link below. I&apos;m mostly looking for current AppFuse users. By that, I mean folks that have used 1.x or 2.x on a project in the last 6 months, or plan on using it in the next month or two.
&lt;br/&gt;&lt;br/&gt;
You&apos;ll need to create an account and login to vote. To do this, go to View &gt; Account &gt; Sign Up (after clicking on the link below). 
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://appfuse.org/pages/viewpage.action?pageId=986&quot;&gt;http://appfuse.org/pages/viewpage.action?pageId=986&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I&apos;ll compile the results of this poll on Friday morning (April 27th), so you have until then for your vote to be counted!
&lt;br/&gt;&lt;br/&gt;
On a related note, if anyone knows how to get the monthly posting statistics from &lt;a href=&quot;http://forum.springframework.org/forumdisplay.php?f=25&quot;&gt;Spring MVC&apos;s forums&lt;/a&gt;, I&apos;d love to hear about it. My &quot;mailing list traffic&quot; slide has excluded them for the past couple of years because I&apos;ve been unable to get a count of monthly postings.
&lt;br/&gt;&lt;br/&gt;
&lt;strong&gt;NOTE:&lt;/strong&gt; If you vote by adding a comment to this entry, it won&apos;t be counted. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Thanks to the 64 of you that voted. Here&apos;s the results of the poll:&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;img src=&quot;//static.raibledesigns.com/repository/images/webframework-usage-200704.gif&quot; alt=&quot;AppFuse Web Framework Usage&quot; width=&quot;500&quot; height=&quot;313&quot; /&gt;
&lt;/p&gt;&lt;p&gt;As I said &lt;a href=&quot;http://raibledesigns.com/rd/entry/spring_mvc_the_most_popular&quot;&gt;last time&lt;/a&gt;, I find the results interesting because AppFuse lowers the barriers and reduces the learning curve for all of these frameworks.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/equinox_a_k_a_appfuse1</id>
        <title type="html">Equinox (a.k.a. AppFuse Light) 1.7.1 Released!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/equinox_a_k_a_appfuse1"/>
        <published>2007-04-21T17:27:33-06:00</published>
        <updated>2007-04-21T23:27:33-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webwork" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="velocity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="acegi" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jdo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpox" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ojb" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ajax" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="freemarker" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Equinox 1.7.1 contains a number of dependency updates, and not much else. This will be the last release with the Equinox name. This project is changing its name to &lt;strong&gt;AppFuse Light&lt;/strong&gt; and will be referred to by that name going forward. The project will be moving its source code to &lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;http://appfuse-light.dev.java.net&lt;/a&gt;. The equinox.dev.java.net project will remain because &lt;a href=&quot;http://www.w3.org/Provider/Style/URI&quot;&gt;Cool URIs don&apos;t change&lt;/a&gt;. In addition to the name change, I&apos;d like to try to merge the AppFuse and Equinox user communities. Since the technologies are so similar, and AppFuse 2.x will use some of Equinox&apos;s Ant scripts, it makes sense to bring these projects closer together.
&lt;/p&gt;
&lt;p&gt;In AppFuse Light 1.8, I plan on adding support for Stripes and Wicket as well as integrating the CSS Framework (like AppFuse uses).&lt;/p&gt;
&lt;p&gt;50 possible combinations are available for &lt;a href=&quot;https://equinox.dev.java.net/servlets/ProjectDocumentList?folderID=7074&quot;&gt;download&lt;/a&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web Frameworks:&lt;/strong&gt; JSF (MyFaces), Spring MVC (with Ajax, Acegi Security, JSP, FreeMarker or Velocity), Struts 1.x, Struts 2.x, Tapestry, WebWork&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persistence Frameworks:&lt;/strong&gt; Hibernate, iBATIS, JDO (JPOX), OJB, Spring JDBC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
All of the frameworks used in Equinox, as well as most of its build/test system is
explained in &lt;a href=&quot;http://www.springlive.com&quot;&gt;Spring Live&lt;/a&gt;. Going forward, documentation will be put on the &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse site&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
A summary of the changes in this release are below:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Removed custom JavaScript and CSS for MyFaces Tomahawk&apos;s &lt;t:inputCalendar&gt;&lt;/li&gt;
    &lt;li&gt;Dependent packages upgraded:
        &lt;ul&gt;
            &lt;li&gt;Ajax4JSF 1.0.6&lt;/li&gt;
            &lt;li&gt;Cargo 0.9&lt;/li&gt;
            &lt;li&gt;Commons Collections 3.2&lt;/li&gt;
            &lt;li&gt;Commons DBCP 1.2.2&lt;/li&gt;
            &lt;li&gt;Commons Lang 2.3&lt;/li&gt;
            &lt;li&gt;Commons Validator 1.3.1&lt;/li&gt;
            &lt;li&gt;DWR 2.0 RC2&lt;/li&gt;
            &lt;li&gt;FreeMarker 2.3.9&lt;/li&gt;
            &lt;li&gt;JPOX 1.1.7&lt;/li&gt;
            &lt;li&gt;JUnit 3.8.2&lt;/li&gt;
            &lt;li&gt;Hibernate 3.2.1&lt;/li&gt;
            &lt;li&gt;iBATIS 2.3.0&lt;/li&gt;
            &lt;li&gt;MyFaces and Tomahawk 1.1.5&lt;/li&gt;
            &lt;li&gt;Spring 2.0.4&lt;/li&gt;
            &lt;li&gt;Spring Modules Validation 0.8&lt;/li&gt;
            &lt;li&gt;Struts 2.0.6&lt;/li&gt;
            &lt;li&gt;Tapestry 4.1.1&lt;/li&gt;
            &lt;li&gt;Velocity 1.5&lt;/li&gt;
            &lt;li&gt;Velocity Tools 1.3&lt;/li&gt;
            &lt;li&gt;WebWork 2.2.5&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
For more information about installing the 
various options, see the &lt;a href=&quot;https://equinox.dev.java.net/source/browse/*checkout*/equinox/README.txt?only_with_tag=release-1_7_1&quot;&gt;README.txt&lt;/a&gt; file. Live demos (thanks to &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt;!) are available at:
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/equinox&quot;&gt;Spring&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo.raibledesigns.com/equinox-ajax&quot;&gt;Spring + Ajax&lt;/a&gt; 
            &amp;middot; &lt;a href=&quot;http://demo.raibledesigns.com/equinox-security&quot;&gt;Spring + Acegi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/equinox-jsf&quot;&gt;JSF + Facelets&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/equinox-struts&quot;&gt;Struts 1&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo.raibledesigns.com/equinox-struts2&quot;&gt;Struts 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/equinox-tapestry&quot;&gt;Tapestry&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/equinox-webwork&quot;&gt;WebWork&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;If you have any questions, please &lt;a href=&quot;http://raibledesigns.com/rd/entry/equinox_a_k_a_appfuse#comments&quot;&gt;read the comments from the 1.7 release&lt;/a&gt; or ask them on the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;AppFuse mailing list&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/ant_vs_maven</id>
        <title type="html">Ant vs. Maven</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/ant_vs_maven"/>
        <published>2007-04-16T11:26:13-06:00</published>
        <updated>2007-04-16T17:27:10-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="ant" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">I found a good post from Steve Loughran on &lt;a href=&quot;http://www.1060.org/blogxter/entry?publicid=9EE3794599F42C4E1D9BF2F2FE655180&quot;&gt;what&apos;s wrong with Maven&apos;s repositories&lt;/a&gt;. I agree with most of his points, but would like to point out &lt;a href=&quot;http://mvnrepository.com/&quot;&gt;mvnrepository.com&lt;/a&gt;. This site seems to provide good XML Feeds for what&apos;s been uploaded to Maven&apos;s Central Repository. If you&apos;re using Maven, you should probably subscribe to its &lt;a href=&quot;http://mvnrepository.com/feeds/atom.xml&quot;&gt;Atom Feed&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
In related news, Timothy M. O&apos;Brien has an entry about &lt;a href=&quot;http://www.oreillynet.com/onjava/blog/2007/04/upcoming_book_ant_in_action_1.html&quot;&gt;Steve&apos;s upcoming book: Ant in Action&lt;/a&gt;. This book is the 2nd edition of &lt;a href=&quot;http://www.manning.com/hatcher/&quot;&gt;Java Development with Ant&lt;/a&gt;. I have a hard time believing Erik Hatcher is helping Steve write Ant in Action - AFAIK, he&apos;s off in Rails-land enjoying himself. Regardless, I&apos;m sure Ant in Action will be an excellent book. Java Development with Ant is one of my favorite technical books of all time and is largely responsible for inspiring me to write &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. I read JDwA way back in October 2002 and used a lot of its code to develop AppFuse 1.x&apos;s Ant-based build system.&lt;br/&gt;&lt;br/&gt;
Like Tim, I still like Ant. However, AppFuse 2.x uses Maven 2 and most of the projects I work on these days use Maven 2. It may surprise some folks, but I actually like Maven 2 (not Maven 1). Sure it has issues, but after a year of using it in anger, I know how to solve most of its quirks. AppFuse 2.x users will benefit from this greatly and I&apos;m thinking of changing its tagline to &quot;We make Maven work.&quot; &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;
&lt;br/&gt;&lt;br/&gt;
One of the most interesting things about moving to Maven is we were easily able to make AppFuse more like a framework than a project starter kit.  We &lt;em&gt;thought&lt;/em&gt; this is what most folks wanted - especially the ability to upgrade a project to the latest version of AppFuse. While &lt;em&gt;some&lt;/em&gt; folks wanted this, it seems like &lt;em&gt;most&lt;/em&gt; folks liked the full-source version that was a pain-in-the-ass to upgrade. I don&apos;t blame them. On the project I&apos;m on, I&apos;ll likely be converting to a full-source version before the project is over. That&apos;s why &lt;a href=&quot;http://issues.appfuse.org/browse/APF-675&quot;&gt;APF-675&lt;/a&gt; exists. I doubt we&apos;ll make it happen for the 2.0 final release, but it &lt;em&gt;is&lt;/em&gt; on our radar of things to do shortly after. With any luck, we&apos;ll create a way to migrate projects using embedded AppFuse to full-source AppFuse.
&lt;br/&gt;&lt;br/&gt;
I&apos;d also like to point out something ironic. With AppFuse 1.x, there were a &lt;em&gt;lot&lt;/em&gt; of folks that advocated we move to Maven. Their primary reasoning - the Ant build scripts were too long and complicated. How about a good ol&apos; lines of XML comparison for those folks:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Lines of Ant-related XML in AppFuse 1.x: 1655&lt;/li&gt;
&lt;li&gt;Lines of Maven-related XML in AppFuse 2.x: 2847&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oh wait, that&apos;s not a fair comparison. The above number is for AppFuse in SVN, which end users won&apos;t deal with. A new project created with AppFuse 2.x will likely have a pom.xml with 634 lines. That&apos;s about 1/3 of the amount needed for Ant in AppFuse 1.x. Maven hasn&apos;t exactly gotten us away from XML hell though. How about a LOC count for archetypes vs. installers:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Lines of Ant-related XML for AppFuse 1.x framework installers: 2786&lt;/li&gt;
&lt;li&gt;Lines of Maven-related XML for AppFuse 2.x archetypes (including archetype&apos;s pom.xml files): Too much to count. Creating archetypes is &lt;em&gt;waayyyy&lt;/em&gt; too complicated IMO. Basic archetypes seem to be around 740 lines (pom.xml for archetype project, archetype.xml and archetype&apos;s pom.xml), modular archetypes are around 870. 740 x 4 + 870 x 4 = 6440. I&apos;m guessing the full-source archetypes will add another 5000 lines of XML. Ugh.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This XML-for-archetypes comparison might be unfair as well. With 1.x, you could only create a webapp, with 2.x, you can create a modular application and chop off the web-portion if you so choose.&lt;/p&gt;
&lt;p&gt;
Of course, the real benefits of moving to Maven are elsewhere. We&apos;ve seen quite an uptick on the mailing list in the last few months. There&apos;s &lt;a href=&quot;http://candy4appfuse.sf.net&quot;&gt;tools cropping up&lt;/a&gt; and I&apos;ve gotten quite a few inquiries about training (yes, I do have a 3-day course on Spring, Hibernate, Ajax, Maven and AppFuse). To me, AppFuse 2.x seems more complicated than 1.x, but it seems the community thinks otherwise. Judging from the increased amount of developer activity on the project, developers seem more interested in a Maven-based system too. Then again, we are &lt;em&gt;making Maven work!&lt;/em&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_m4_released</id>
        <title type="html">AppFuse 2.0 M4 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_m4_released"/>
        <published>2007-03-24T16:33:21-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.0 M4! This release marks a milestone in the usability of AppFuse 2.x. A lot of folks (including myself) have been using AppFuse 2.0 on projects and have fixed quite a few issues. In addition to polishing the tutorials, we&apos;ve fixed a fair amount of i18n bugs and packaging issues with modular archetypes. &lt;/p&gt;

&lt;p&gt;We were hoping to get AMP&apos;s code generation and XFire integrated in M4, but were it&apos;s going to have to wait until M5.&lt;/p&gt;

&lt;p&gt;AppFuse 2.0 is available as a Maven archetype. For information on creating a new project using this release, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt; and join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. The &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2&quot; title=&quot;Maven 2&quot;&gt;Maven Reference Guide&lt;/a&gt; has a map of &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2#Maven2-Antvs.Maven&quot;&gt;Ant &amp;raquo; Maven commands&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The 2.0 series of AppFuse has a minumum requirement of the following specification versions:&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;Java Servlet 2.4 and JavaServer Pages (JSP) 2.0&lt;/li&gt;
	&lt;li&gt;Java 5 for Development (Java 1.4 for deployment using the &lt;a href=&quot;http://mojo.codehaus.org/retrotranslator-maven-plugin/examples/project-translation.html&quot;&gt;Retrotranslator Plugin&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more information, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0+M4&quot; title=&quot;Release Notes 2.0 M4&quot;&gt;2.0 M4 Release Notes&lt;/a&gt;. To see how AppFuse 2.x works, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot;&gt;video demos&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;smokey&quot;&gt;
Comments and issues should be sent to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0-M4-Released-tf3460541s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We appreciate the time and effort everyone has put toward contributing code and documentation, posting to the mailing lists, and logging issues. We also greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://cenqua.com/&quot;&gt;Cenqua&lt;/a&gt;, &lt;a href=&quot;http://contegix.com/&quot;&gt;Contegix&lt;/a&gt;, &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt;, &lt;a href=&quot;http://www.java.net&quot;&gt;Java.net&lt;/a&gt; and &lt;a href=&quot;http://kgbinternet.com/&quot;&gt;KGBInternet&lt;/a&gt;.  Without them, working on this project wouldn&apos;t be nearly as much fun.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/integrating_selenium_with_maven_2</id>
        <title type="html">Integrating Selenium with Maven 2</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/integrating_selenium_with_maven_2"/>
        <published>2007-03-09T10:35:04-07:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="selenium" scheme="http://roller.apache.org/ns/tags/" />
        <category term="testing" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">I spent some time this past week integrating &lt;a href=&quot;http://www.openqa.org/selenium/&quot;&gt;Selenium&lt;/a&gt; with Maven 2. This post is designed to show you how to do this in your Maven 2 projects.&lt;br/&gt;&lt;br/&gt;
First of all, there were two types of testing scenarios I wanted to make possible.  The first was to allow HTML-based tests that web designers could create and run with &lt;a href=&quot;http://www.openqa.org/selenium-ide/&quot;&gt;Selenium IDE&lt;/a&gt;. As far as I know, Selenium IDE is capable of recording and exporting Java-based tests (powered by TestNG or JUnit), but I don&apos;t believe it&apos;s capable of playing them back.  So for Java Developers, I wanted to allow them to write their tests in Java.&lt;br/&gt;&lt;br/&gt;
To get Maven to run HTML-based tests, the easiest way seems to be using the &lt;a href=&quot;http://www.openqa.org/selenium-rc/selenese.html&quot;&gt;&amp;lt;selenese&gt;&lt;/a&gt; Ant task. I tried &lt;a href=&quot;http://mavenium.sourceforge.net/&quot;&gt;Mavenium&lt;/a&gt; as well, but it 1) doesn&apos;t use the latest version of Selenium RC and 2) reports success when tests fail.  Below is a Maven profile that I&apos;m using in an AppFuse-based project to run HTML tests. 
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;profiles&amp;gt;
    &amp;lt;profile&amp;gt;
        &amp;lt;id&amp;gt;integration-test&amp;lt;/id&amp;gt;
        &amp;lt;activation&amp;gt;
            &amp;lt;property&amp;gt;
                &amp;lt;name&amp;gt;!maven.test.skip&amp;lt;/name&amp;gt;
            &amp;lt;/property&amp;gt;
        &amp;lt;/activation&amp;gt;
        &amp;lt;build&amp;gt;
            &amp;lt;plugins&amp;gt;
                &amp;lt;plugin&amp;gt;
                    &amp;lt;groupId&amp;gt;org.codehaus.cargo&amp;lt;/groupId&amp;gt;
                    &amp;lt;artifactId&amp;gt;cargo-maven2-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;version&amp;gt;0.3-SNAPSHOT&amp;lt;/version&amp;gt;
                    &amp;lt;configuration&amp;gt;
                        &amp;lt;wait&amp;gt;${cargo.wait}&amp;lt;/wait&amp;gt;
                        &amp;lt;container&amp;gt;
                            &amp;lt;containerId&amp;gt;${cargo.container}&amp;lt;/containerId&amp;gt;
                            &amp;lt;!--home&amp;gt;${cargo.container.home}&amp;lt;/home--&amp;gt;
                            &amp;lt;zipUrlInstaller&amp;gt;
                                &amp;lt;url&amp;gt;${cargo.container.url}&amp;lt;/url&amp;gt;
                                &amp;lt;installDir&amp;gt;${installDir}&amp;lt;/installDir&amp;gt;
                            &amp;lt;/zipUrlInstaller&amp;gt;
                        &amp;lt;/container&amp;gt;
                        &amp;lt;configuration&amp;gt;
                            &amp;lt;home&amp;gt;${project.build.directory}/${cargo.container}/container&amp;lt;/home&amp;gt;
                            &amp;lt;properties&amp;gt;
                                &amp;lt;cargo.hostname&amp;gt;${cargo.host}&amp;lt;/cargo.hostname&amp;gt;
                                &amp;lt;cargo.servlet.port&amp;gt;${cargo.port}&amp;lt;/cargo.servlet.port&amp;gt;
                            &amp;lt;/properties&amp;gt;
                        &amp;lt;/configuration&amp;gt;
                    &amp;lt;/configuration&amp;gt;
                    &amp;lt;executions&amp;gt;
                        &amp;lt;execution&amp;gt;
                            &amp;lt;id&amp;gt;start-container&amp;lt;/id&amp;gt;
                            &amp;lt;phase&amp;gt;pre-integration-test&amp;lt;/phase&amp;gt;
                            &amp;lt;goals&amp;gt;
                                &amp;lt;goal&amp;gt;start&amp;lt;/goal&amp;gt;
                            &amp;lt;/goals&amp;gt;
                        &amp;lt;/execution&amp;gt;
                        &amp;lt;execution&amp;gt;
                            &amp;lt;id&amp;gt;stop-container&amp;lt;/id&amp;gt;
                            &amp;lt;phase&amp;gt;post-integration-test&amp;lt;/phase&amp;gt;
                            &amp;lt;goals&amp;gt;
                                &amp;lt;goal&amp;gt;stop&amp;lt;/goal&amp;gt;
                            &amp;lt;/goals&amp;gt;
                        &amp;lt;/execution&amp;gt;
                    &amp;lt;/executions&amp;gt;
                &amp;lt;/plugin&amp;gt;
                &amp;lt;plugin&amp;gt;
                    &amp;lt;artifactId&amp;gt;maven-antrun-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;executions&amp;gt;
                        &amp;lt;execution&amp;gt;
                            &amp;lt;id&amp;gt;launch-selenium&amp;lt;/id&amp;gt;
                            &amp;lt;phase&amp;gt;integration-test&amp;lt;/phase&amp;gt;
                            &amp;lt;configuration&amp;gt;
                                &amp;lt;tasks&amp;gt;
                                    &amp;lt;taskdef resource=&quot;selenium-ant.properties&quot;&amp;gt;
                                        &amp;lt;classpath refid=&quot;maven.plugin.classpath&quot;/&amp;gt;
                                    &amp;lt;/taskdef&amp;gt;
                                    &amp;lt;selenese suite=&quot;src/test/resources/selenium/TestSuite.html&quot;
                                              browser=&quot;*firefox&quot; timeoutInSeconds=&quot;180&quot; port=&quot;5555&quot;
                                              results=&quot;${project.build.directory}/selenium-firefox-results.html&quot;
                                              startURL=&quot;http://${cargo.host}:${cargo.port}/${project.build.finalName}/&quot;/&amp;gt;
                                &amp;lt;/tasks&amp;gt;
                            &amp;lt;/configuration&amp;gt;
                            &amp;lt;goals&amp;gt;
                                &amp;lt;goal&amp;gt;run&amp;lt;/goal&amp;gt;
                            &amp;lt;/goals&amp;gt;
                        &amp;lt;/execution&amp;gt;
                    &amp;lt;/executions&amp;gt;
                    &amp;lt;dependencies&amp;gt;
                        &amp;lt;dependency&amp;gt;
                            &amp;lt;groupId&amp;gt;ant&amp;lt;/groupId&amp;gt;
                            &amp;lt;artifactId&amp;gt;ant-nodeps&amp;lt;/artifactId&amp;gt;
                            &amp;lt;version&amp;gt;1.6.5&amp;lt;/version&amp;gt;
                        &amp;lt;/dependency&amp;gt;
                        &amp;lt;dependency&amp;gt;
                            &amp;lt;groupId&amp;gt;org.openqa.selenium.server&amp;lt;/groupId&amp;gt;
                            &amp;lt;artifactId&amp;gt;selenium-server&amp;lt;/artifactId&amp;gt;
                            &amp;lt;version&amp;gt;0.9.1-SNAPSHOT&amp;lt;/version&amp;gt;
                        &amp;lt;/dependency&amp;gt;
                    &amp;lt;/dependencies&amp;gt;
                &amp;lt;/plugin&amp;gt;
            &amp;lt;/plugins&amp;gt;
        &amp;lt;/build&amp;gt;
    &amp;lt;/profile&amp;gt;
    &amp;lt;profile&amp;gt;
        &amp;lt;id&amp;gt;selenium-ie&amp;lt;/id&amp;gt;
        &amp;lt;activation&amp;gt;
            &amp;lt;os&amp;gt;
                &amp;lt;family&amp;gt;windows&amp;lt;/family&amp;gt;
            &amp;lt;/os&amp;gt;
        &amp;lt;/activation&amp;gt;
        &amp;lt;build&amp;gt;
            &amp;lt;plugins&amp;gt;
                &amp;lt;plugin&amp;gt;
                    &amp;lt;artifactId&amp;gt;maven-antrun-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;executions&amp;gt;
                        &amp;lt;execution&amp;gt;
                            &amp;lt;id&amp;gt;launch-selenium&amp;lt;/id&amp;gt;
                            &amp;lt;phase&amp;gt;integration-test&amp;lt;/phase&amp;gt;
                            &amp;lt;configuration&amp;gt;
                                &amp;lt;tasks&amp;gt;
                                    &amp;lt;taskdef resource=&quot;selenium-ant.properties&quot;&amp;gt;
                                        &amp;lt;classpath refid=&quot;maven.plugin.classpath&quot;/&amp;gt;
                                    &amp;lt;/taskdef&amp;gt;
                                    &amp;lt;selenese suite=&quot;src/test/resources/selenium/TestSuite.html&quot;
                                              browser=&quot;*firefox&quot; timeoutInSeconds=&quot;180&quot; port=&quot;5555&quot;
                                              results=&quot;${project.build.directory}/selenium-firefox-results.html&quot;
                                              startURL=&quot;http://${cargo.host}:${cargo.port}/${project.build.finalName}/&quot;/&amp;gt;
                                    &amp;lt;selenese suite=&quot;src/test/resources/selenium/TestSuite.html&quot;
                                              browser=&quot;*iexplore&quot; timeoutInSeconds=&quot;180&quot; port=&quot;5555&quot;
                                              results=&quot;${project.build.directory}/selenium-ie-results.html&quot;
                                              startURL=&quot;http://${cargo.host}:${cargo.port}/${project.build.finalName}/&quot;/&amp;gt;
                                &amp;lt;/tasks&amp;gt;
                            &amp;lt;/configuration&amp;gt;
                            &amp;lt;goals&amp;gt;
                                &amp;lt;goal&amp;gt;run&amp;lt;/goal&amp;gt;
                            &amp;lt;/goals&amp;gt;
                        &amp;lt;/execution&amp;gt;
                    &amp;lt;/executions&amp;gt;
                &amp;lt;/plugin&amp;gt;
            &amp;lt;/plugins&amp;gt;
        &amp;lt;/build&amp;gt;
    &amp;lt;/profile&amp;gt;
&amp;lt;/profiles&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The above setup will allow you to run Selenium tests in Firefox, and in IE as well when you&apos;re on Windows. I tried to get Safari to work on the Mac, but it just opens Safari and &lt;a href=&quot;http://forums.openqa.org/message.jspa?messageID=16208#19605&quot;&gt;hangs&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;
HTML tests are great for non-programmers, but what about developers that prefer Java and want test reports to be included in the surefire-plugin&apos;s reports?  That&apos;s easy enough. First of all, put your tests in a particular package so they can be excluded from the normal testing cycle.  I used a &lt;code&gt;webapp.selenium&lt;/code&gt; package.  I configured the surefire-plugin to exclude these tests:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;excludes&amp;gt;
            &amp;lt;exclude&amp;gt;**/selenium/*Test.java&amp;lt;/exclude&amp;gt;
        &amp;lt;/excludes&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Then I added the newly released &lt;a href=&quot;http://mojo.codehaus.org/selenium-maven-plugin/&quot;&gt;selenium-maven-plugin&lt;/a&gt; to my &quot;integration-test&quot; profile and configured surefire to run the Selenium Java tests.
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;selenium-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0-beta-1&amp;lt;/version&amp;gt;  
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;id&amp;gt;start-selenium&amp;lt;/id&amp;gt;
            &amp;lt;phase&amp;gt;pre-integration-test&amp;lt;/phase&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;start-server&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;background&amp;gt;true&amp;lt;/background&amp;gt;
            &amp;lt;/configuration&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;executions&amp;gt;
        &amp;lt;execution&amp;gt;
            &amp;lt;id&amp;gt;surefire-it&amp;lt;/id&amp;gt;
            &amp;lt;phase&amp;gt;integration-test&amp;lt;/phase&amp;gt;
            &amp;lt;goals&amp;gt;
                &amp;lt;goal&amp;gt;test&amp;lt;/goal&amp;gt;
            &amp;lt;/goals&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;excludes&amp;gt;
                    &amp;lt;exclude&amp;gt;none&amp;lt;/exclude&amp;gt;
                &amp;lt;/excludes&amp;gt;
                &amp;lt;includes&amp;gt;
                    &amp;lt;include&amp;gt;**/selenium/*Test.java&amp;lt;/include&amp;gt;
                &amp;lt;/includes&amp;gt;
            &amp;lt;/configuration&amp;gt;
        &amp;lt;/execution&amp;gt;
    &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Yeah, Maven can be quite verbose when configuring profiles.  I &lt;a href=&quot;http://www.nabble.com/Selenium%2C-profiles-and-executing-certain-browsers-on-certain-OSs-tf3358368.html#a9341212&quot;&gt;contacted the Maven list&lt;/a&gt; to see if it&apos;s possible to simplify all this XML, but so far haven&apos;t found a solution.&lt;br/&gt;&lt;br/&gt;
If you&apos;d like to see a pom.xml with the Selenium bits and a profile that runs both HTML and Java-based tests, &lt;a href=&quot;?&quot; onclick=&quot;Element.toggle($(&apos;selenium-profile&apos;)); return false&quot;&gt;click here&lt;/a&gt; (JavaScript needs to be enabled for this to work).
&lt;pre id=&quot;selenium-profile&quot; style=&quot;display:none&quot;&gt;
&amp;lt;build&amp;gt;
    &amp;lt;plugins&amp;gt;
        &amp;lt;plugin&amp;gt;
            &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;configuration&amp;gt;
                &amp;lt;excludes&amp;gt;
                    &amp;lt;exclude&amp;gt;**/selenium/*Test.java&amp;lt;/exclude&amp;gt;
                &amp;lt;/excludes&amp;gt;
            &amp;lt;/configuration&amp;gt;
        &amp;lt;/plugin&amp;gt;
    &amp;lt;/plugins&amp;gt;
&amp;lt;/build&amp;gt;

&amp;lt;repositories&amp;gt;
    &amp;lt;repository&amp;gt;
        &amp;lt;id&amp;gt;openqa&amp;lt;/id&amp;gt;
        &amp;lt;url&amp;gt;http://maven.openqa.org&amp;lt;/url&amp;gt;
    &amp;lt;/repository&amp;gt;
&amp;lt;/repositories&amp;gt;

&amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.openqa.selenium.client-drivers&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;selenium-java-client-driver&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;0.9.1-SNAPSHOT&amp;lt;/version&amp;gt;
        &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;

&amp;lt;profiles&amp;gt;
    &amp;lt;profile&amp;gt;
        &amp;lt;id&amp;gt;integration-test&amp;lt;/id&amp;gt;
        &amp;lt;activation&amp;gt;
            &amp;lt;property&amp;gt;
                &amp;lt;name&amp;gt;!maven.test.skip&amp;lt;/name&amp;gt;
            &amp;lt;/property&amp;gt;
        &amp;lt;/activation&amp;gt;
        &amp;lt;build&amp;gt;
            &amp;lt;plugins&amp;gt;
                &amp;lt;plugin&amp;gt;
                    &amp;lt;groupId&amp;gt;org.codehaus.cargo&amp;lt;/groupId&amp;gt;
                    &amp;lt;artifactId&amp;gt;cargo-maven2-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;version&amp;gt;0.3-SNAPSHOT&amp;lt;/version&amp;gt;
                    &amp;lt;configuration&amp;gt;
                        &amp;lt;wait&amp;gt;${cargo.wait}&amp;lt;/wait&amp;gt;
                        &amp;lt;container&amp;gt;
                            &amp;lt;containerId&amp;gt;${cargo.container}&amp;lt;/containerId&amp;gt;
                            &amp;lt;!--home&amp;gt;${cargo.container.home}&amp;lt;/home--&amp;gt;
                            &amp;lt;zipUrlInstaller&amp;gt;
                                &amp;lt;url&amp;gt;${cargo.container.url}&amp;lt;/url&amp;gt;
                                &amp;lt;installDir&amp;gt;${installDir}&amp;lt;/installDir&amp;gt;
                            &amp;lt;/zipUrlInstaller&amp;gt;
                        &amp;lt;/container&amp;gt;
                        &amp;lt;configuration&amp;gt;
                            &amp;lt;home&amp;gt;${project.build.directory}/${cargo.container}/container&amp;lt;/home&amp;gt;
                            &amp;lt;properties&amp;gt;
                                &amp;lt;cargo.hostname&amp;gt;${cargo.host}&amp;lt;/cargo.hostname&amp;gt;
                                &amp;lt;cargo.servlet.port&amp;gt;${cargo.port}&amp;lt;/cargo.servlet.port&amp;gt;
                            &amp;lt;/properties&amp;gt;
                        &amp;lt;/configuration&amp;gt;
                    &amp;lt;/configuration&amp;gt;
                    &amp;lt;executions&amp;gt;
                        &amp;lt;execution&amp;gt;
                            &amp;lt;id&amp;gt;start-container&amp;lt;/id&amp;gt;
                            &amp;lt;phase&amp;gt;pre-integration-test&amp;lt;/phase&amp;gt;
                            &amp;lt;goals&amp;gt;
                                &amp;lt;goal&amp;gt;start&amp;lt;/goal&amp;gt;
                            &amp;lt;/goals&amp;gt;
                        &amp;lt;/execution&amp;gt;
                        &amp;lt;execution&amp;gt;
                            &amp;lt;id&amp;gt;stop-container&amp;lt;/id&amp;gt;
                            &amp;lt;phase&amp;gt;post-integration-test&amp;lt;/phase&amp;gt;
                            &amp;lt;goals&amp;gt;
                                &amp;lt;goal&amp;gt;stop&amp;lt;/goal&amp;gt;
                            &amp;lt;/goals&amp;gt;
                        &amp;lt;/execution&amp;gt;
                    &amp;lt;/executions&amp;gt;
                &amp;lt;/plugin&amp;gt;
                &amp;lt;!-- Configuration to run Java-based Selenium tests --&amp;gt;
                &amp;lt;plugin&amp;gt;
                    &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                    &amp;lt;artifactId&amp;gt;selenium-maven-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;version&amp;gt;1.0-beta-1&amp;lt;/version&amp;gt;
                    &amp;lt;executions&amp;gt;
                        &amp;lt;execution&amp;gt;
                            &amp;lt;id&amp;gt;start-selenium&amp;lt;/id&amp;gt;
                            &amp;lt;phase&amp;gt;pre-integration-test&amp;lt;/phase&amp;gt;
                            &amp;lt;goals&amp;gt;
                                &amp;lt;goal&amp;gt;start-server&amp;lt;/goal&amp;gt;
                            &amp;lt;/goals&amp;gt;
                            &amp;lt;configuration&amp;gt;
                                &amp;lt;background&amp;gt;true&amp;lt;/background&amp;gt;
                            &amp;lt;/configuration&amp;gt;
                        &amp;lt;/execution&amp;gt;
                    &amp;lt;/executions&amp;gt;
                &amp;lt;/plugin&amp;gt;
                &amp;lt;plugin&amp;gt;
                    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;executions&amp;gt;
                        &amp;lt;execution&amp;gt;
                            &amp;lt;id&amp;gt;surefire-it&amp;lt;/id&amp;gt;
                            &amp;lt;phase&amp;gt;integration-test&amp;lt;/phase&amp;gt;
                            &amp;lt;goals&amp;gt;
                                &amp;lt;goal&amp;gt;test&amp;lt;/goal&amp;gt;
                            &amp;lt;/goals&amp;gt;
                            &amp;lt;configuration&amp;gt;
                                &amp;lt;excludes&amp;gt;
                                    &amp;lt;exclude&amp;gt;none&amp;lt;/exclude&amp;gt;
                                &amp;lt;/excludes&amp;gt;
                                &amp;lt;includes&amp;gt;
                                    &amp;lt;include&amp;gt;**/selenium/*Test.java&amp;lt;/include&amp;gt;
                                &amp;lt;/includes&amp;gt;
                            &amp;lt;/configuration&amp;gt;
                        &amp;lt;/execution&amp;gt;
                    &amp;lt;/executions&amp;gt;
                &amp;lt;/plugin&amp;gt;
                &amp;lt;!-- End of configuration for Java-based tests --&amp;gt;
                &amp;lt;plugin&amp;gt;
                    &amp;lt;artifactId&amp;gt;maven-antrun-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;executions&amp;gt;
                        &amp;lt;execution&amp;gt;
                            &amp;lt;id&amp;gt;launch-selenium&amp;lt;/id&amp;gt;
                            &amp;lt;phase&amp;gt;integration-test&amp;lt;/phase&amp;gt;
                            &amp;lt;configuration&amp;gt;
                                &amp;lt;tasks&amp;gt;
                                    &amp;lt;taskdef resource=&quot;selenium-ant.properties&quot;&amp;gt;
                                        &amp;lt;classpath refid=&quot;maven.plugin.classpath&quot;/&amp;gt;
                                    &amp;lt;/taskdef&amp;gt;
                                    &amp;lt;selenese suite=&quot;src/test/resources/selenium/TestSuite.html&quot;
                                              browser=&quot;*firefox&quot; timeoutInSeconds=&quot;180&quot; port=&quot;5555&quot;
                                              results=&quot;${project.build.directory}/selenium-firefox-results.html&quot;
                                              startURL=&quot;http://${cargo.host}:${cargo.port}/${project.build.finalName}/&quot;/&amp;gt;
                                &amp;lt;/tasks&amp;gt;
                            &amp;lt;/configuration&amp;gt;
                            &amp;lt;goals&amp;gt;
                                &amp;lt;goal&amp;gt;run&amp;lt;/goal&amp;gt;
                            &amp;lt;/goals&amp;gt;
                        &amp;lt;/execution&amp;gt;
                    &amp;lt;/executions&amp;gt;
                    &amp;lt;dependencies&amp;gt;
                        &amp;lt;dependency&amp;gt;
                            &amp;lt;groupId&amp;gt;ant&amp;lt;/groupId&amp;gt;
                            &amp;lt;artifactId&amp;gt;ant-nodeps&amp;lt;/artifactId&amp;gt;
                            &amp;lt;version&amp;gt;1.6.5&amp;lt;/version&amp;gt;
                        &amp;lt;/dependency&amp;gt;
                        &amp;lt;dependency&amp;gt;
                            &amp;lt;groupId&amp;gt;org.openqa.selenium.server&amp;lt;/groupId&amp;gt;
                            &amp;lt;artifactId&amp;gt;selenium-server&amp;lt;/artifactId&amp;gt;
                            &amp;lt;version&amp;gt;0.9.1-SNAPSHOT&amp;lt;/version&amp;gt;
                        &amp;lt;/dependency&amp;gt;
                    &amp;lt;/dependencies&amp;gt;
                &amp;lt;/plugin&amp;gt;
            &amp;lt;/plugins&amp;gt;
        &amp;lt;/build&amp;gt;
    &amp;lt;/profile&amp;gt;
    &amp;lt;profile&amp;gt;
        &amp;lt;id&amp;gt;selenium-ie&amp;lt;/id&amp;gt;
        &amp;lt;activation&amp;gt;
            &amp;lt;os&amp;gt;
                &amp;lt;family&amp;gt;windows&amp;lt;/family&amp;gt;
            &amp;lt;/os&amp;gt;
        &amp;lt;/activation&amp;gt;
        &amp;lt;build&amp;gt;
            &amp;lt;plugins&amp;gt;
                &amp;lt;plugin&amp;gt;
                    &amp;lt;artifactId&amp;gt;maven-antrun-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;executions&amp;gt;
                        &amp;lt;execution&amp;gt;
                            &amp;lt;id&amp;gt;launch-selenium&amp;lt;/id&amp;gt;
                            &amp;lt;phase&amp;gt;integration-test&amp;lt;/phase&amp;gt;
                            &amp;lt;configuration&amp;gt;
                                &amp;lt;tasks&amp;gt;
                                    &amp;lt;taskdef resource=&quot;selenium-ant.properties&quot;&amp;gt;
                                        &amp;lt;classpath refid=&quot;maven.plugin.classpath&quot;/&amp;gt;
                                    &amp;lt;/taskdef&amp;gt;
                                    &amp;lt;selenese suite=&quot;src/test/resources/selenium/TestSuite.html&quot;
                                              browser=&quot;*firefox&quot; timeoutInSeconds=&quot;180&quot; port=&quot;5555&quot;
                                              results=&quot;${project.build.directory}/selenium-firefox-results.html&quot;
                                              startURL=&quot;http://${cargo.host}:${cargo.port}/${project.build.finalName}/&quot;/&amp;gt;
                                    &amp;lt;selenese suite=&quot;src/test/resources/selenium/TestSuite.html&quot;
                                              browser=&quot;*iexplore&quot; timeoutInSeconds=&quot;180&quot; port=&quot;5555&quot;
                                              results=&quot;${project.build.directory}/selenium-ie-results.html&quot;
                                              startURL=&quot;http://${cargo.host}:${cargo.port}/${project.build.finalName}/&quot;/&amp;gt;
                                &amp;lt;/tasks&amp;gt;
                            &amp;lt;/configuration&amp;gt;
                            &amp;lt;goals&amp;gt;
                                &amp;lt;goal&amp;gt;run&amp;lt;/goal&amp;gt;
                            &amp;lt;/goals&amp;gt;
                        &amp;lt;/execution&amp;gt;
                    &amp;lt;/executions&amp;gt;
                &amp;lt;/plugin&amp;gt;
            &amp;lt;/plugins&amp;gt;
        &amp;lt;/build&amp;gt;
    &amp;lt;/profile&amp;gt;
&amp;lt;/profiles&amp;gt;
&lt;/pre&gt;
&lt;blockquote style=&quot;font-style: italic; color: #666&quot;&gt;NOTE: I used 0.9.1-SNAPSHOT of Selenium Server because it solves issues with the latest version of Firefox.&lt;/blockquote&gt;
&lt;p&gt;
This brings up a related question I &lt;a href=&quot;http://www.nabble.com/Questions-for-2.x%3A-Archetypes-and-UI-Testing-tf3364157s2369.html&quot;&gt;asked on the AppFuse mailing list&lt;/a&gt; a couple of days ago:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Do you use the Canoo WebTests?  If not, how do you do UI testing? If so, would you prefer Selenium? 
&lt;/p&gt;
&lt;p&gt;If you&apos;ve tried AppFuse 2.x and have an opinion, please add a comment.  Personally, I like Selenium, but I like how Canoo WebTest can be somewhat friendly to designers and allow i18n testing with Ant&apos;s property file support. With Selenium, you have to use parse/replace or Java tests to do i18n testing.  Then again, if you need to test a lot of Ajax functionality, it&apos;s likely that Selenium will work much better for you.
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/re_jetty_ant_plugin</id>
        <title type="html">RE: Jetty Ant Plugin</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/re_jetty_ant_plugin"/>
        <published>2007-03-08T08:13:08-07:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jetty" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ant" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">It looks like &lt;a href=&quot;http://blogs.webtide.com/janb/2007/03/08/1173333129817.html&quot;&gt;Jetty has a new Plugin for Ant&lt;/a&gt;. If you&apos;ve used the &lt;a href=&quot;http://www.mortbay.org/maven-plugin/index.html&quot;&gt;Jetty Maven Plugin&lt;/a&gt;, you know this is a slick way to quickly deploy your application. For those of you wondering about Tomcat, there&apos;s a similar &lt;a href=&quot;http://mojo.codehaus.org/tomcat-maven-plugin/introduction.html&quot;&gt;Tomcat Maven Plugin&lt;/a&gt; that supports tomcat:run and tomcat:run-war.  However, it&apos;s still in Mojo&apos;s sandbox.
&lt;br/&gt;&lt;br/&gt;
I&apos;m pumped to see this Jetty task for Ant because I&apos;ve been thinking a lot about creating an &lt;a href=&quot;http://issues.appfuse.org/browse/APF-675&quot;&gt;exploded, full-source archetype for AppFuse 2.0&lt;/a&gt;. Of course, it&apos;s probably possible to start Jetty and monitor your project for changes w/o this task - but it does seem to make things a fair amount easier. If we do a full-source archetype, it makes sense to support Ant as well - especially since we can probably re-use the build.xml from AppFuse Light. 
&lt;br/&gt;&lt;br/&gt;
This brings up a related questions I &lt;a href=&quot;http://www.nabble.com/Questions-for-2.x%3A-Archetypes-and-UI-Testing-tf3364157s2369.html&quot;&gt;asked on the AppFuse mailing list&lt;/a&gt; yesterday:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
A couple of questions for folks using (or planning to use) 2.x:
&lt;br/&gt;&lt;br/&gt;
1. As far as archetypes go, are you using basic or modular?
&lt;br/&gt;&lt;br/&gt;
2. If there was a 3rd type of archetype that included the full source (like AppFuse 1.x), would you use it over the existing basic or modular archetypes?  If yes, I&apos;m assuming upgrading is not that big of an issue for you?
&lt;/p&gt;
&lt;p&gt;If you&apos;ve tried AppFuse 2.x and would like to answer these questions, please add a comment.&lt;/p&gt;
&lt;p style=&quot;font-style: italic&quot;&gt;There&apos;s another questions about Selenium vs. Canoo WebTest in that post, but that&apos;s reserved for another entry where I&apos;ll talk about Selenium options in Maven 2.&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/artifactory_a_new_maven_2</id>
        <title type="html">Artifactory - a new Maven 2 Repository Manager for Enterprises</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/artifactory_a_new_maven_2"/>
        <published>2007-03-05T07:35:00-07:00</published>
        <updated>2009-11-11T21:49:03-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="artifactory" scheme="http://roller.apache.org/ns/tags/" />
        <category term="nexus" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">From the &lt;a href=&quot;http://www.nabble.com/-ANN--Artifactory---new-Maven-2-proxy-repository-tf3344299s177.html#a9301347&quot;&gt;Maven 2 user list&lt;/a&gt;:
&lt;/p&gt;
&lt;p class=&quot;quote&quot; style=&quot;color: #666; margin-left: 10px&quot;&gt;
We would like to announce the immediate availability of Artifactory, a Maven 2 enterprise proxy.
&lt;br/&gt;&lt;br/&gt;
Artifactory offers advanced proxying, caching and security facilities to answer the needs of a robust, reproducible and independent build environment using Maven 2.
It uses a JSR-170 Java Content Repository (JCR) for storage, which makes it extremely easy to manage searchable metadata, and provide extended features such as security, transacted operations, auditing, locking, etc.
&lt;br/&gt;&lt;br/&gt;
Artifactory is distributed under APLv2 at &lt;a href=&quot;http://artifactory.sourceforge.net&quot;&gt;http://artifactory.sourceforge.net&lt;/a&gt;. It is currently available as a downloadable archive, that can be run out of the box (with default settings). An install script to run it as a Linux service is also provided. A (limited) guest live demo is available at &lt;a href=&quot;http://www.jfrog.org/artifactory/&quot;&gt;http://www.jfrog.org/artifactory&lt;/a&gt; (username/password is guest/guest).
&lt;br/&gt;&lt;br/&gt;
You are welcome to give it a go!
&lt;br/&gt;&lt;br/&gt;
Cheers,
&lt;br/&gt;&lt;br/&gt;
Yoav Landman,&lt;br/&gt;
The Artifactory Team &lt;br/&gt;
&lt;/p&gt;
&lt;p&gt;So how does this compare to &lt;a href=&quot;http://maven.apache.org/archiva/&quot;&gt;Archiva&lt;/a&gt;, &lt;a href=&quot;http://proximity.abstracthorizon.org/&quot;&gt;Proximity&lt;/a&gt; and &lt;a href=&quot;http://maven-proxy.codehaus.org/&quot;&gt;Maven Proxy&lt;/a&gt;? One user &lt;a href=&quot;http://www.nabble.com/-ANN--Artifactory---new-Maven-2-proxy-repository-tf3344299s177.html#a9308827&quot;&gt;writes&lt;/a&gt; (formatted for better reading):&lt;/p&gt;
&lt;div class=&quot;quote&quot; style=&quot;color: #666; margin-left: 10px; margin-bottom: 10px&quot;&gt;
My experience so far:
&lt;ul class=&quot;glassList&quot; style=&quot;margin-top: 10px&quot;&gt;
&lt;li&gt;&lt;strong&gt;Archiva:&lt;/strong&gt; Alpha; doesn&apos;t work (random webdav deployment failures), loads of bugs, low rate of progress. Feels dead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proximity:&lt;/strong&gt; Works; slightly confusing (don&apos;t like the separation of metadata); lots of new releases constantly; hard to configure (hacking around with spring config files) - our install takes *forever* to restart.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;m2proxy&lt;/strong&gt;: simple, but simple.&lt;/li&gt;
&lt;/ul&gt;
Fingers crossed that artifactory hits the sweet spot...
&lt;/div&gt;
&lt;p&gt;It&apos;s interesting to see that Artifactory&apos;s UI is powered by Wicket and Dojo. The demo seems kind of sluggish, but I don&apos;t believe this application is meant to handle more than 10 users at a time. For more information on Artifactory&apos;s features, see its &lt;a href=&quot;http://www.jfrog.org/sites/artifactory/latest/introduction.html&quot;&gt;introduction page&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;It&apos;s great to see a (seemingly) good tool come out for internal repository management. 
&lt;br/&gt;&lt;br/&gt;
I spent a couple days last week analyzing the best open source continuous integration server for Maven 2 projects. &lt;a href=&quot;http://hudson.dev.java.net&quot;&gt;Hudson&lt;/a&gt; turned out to be the clear winner with the best UI and easiest setup. It also actually &lt;em&gt;worked&lt;/em&gt;, which is a lot more than I can say for Continuum. While I did get Continuum to work, it required turning on anonymous SVN (no, putting the username/password in the URL did &lt;em&gt;not&lt;/em&gt; work). CruiseControl worked as well, but required config.xml knowledge, which sometimes scares admins. Pulse and Bamboo continue to be the best commercial Maven 2 testers, while TeamCity failed my 10-minute test (twice!). One of the features I was looking for was &lt;a href=&quot;http://trac.edgewall.org/&quot;&gt;Trac&lt;/a&gt; integration and that only exists for &lt;a href=&quot;https://oss.werkbold.de/trac-cc&quot;&gt;CruiseControl&lt;/a&gt; and &lt;a href=&quot;http://dev.rectang.com/projects/continutrac&quot;&gt;Continuum&lt;/a&gt;. 
&lt;br/&gt;&lt;br/&gt;
It&apos;s amazing to see projects like Continuum and Archiva. If they&apos;re any reflection of the Maven team&apos;s ability to develop software, that&apos;s frightening. My advice: discontinue both of these projects as they&apos;re a waste of anyone&apos;s time to even research them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update October 2009:&lt;/strong&gt; Fast forward a couple years and I take back what I said about the Maven&apos;s team ability to develop good software. &lt;a href=&quot;http://raibledesigns.com/rd/entry/nexus_is_a_kick_ass&quot;&gt;Nexus is a kick-ass Repository Manager&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/java_is_more_complicated_than</id>
        <title type="html">Java is more complicated than .NET ... unless you use AppFuse</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/java_is_more_complicated_than"/>
        <published>2007-02-20T21:25:15-07:00</published>
        <updated>2012-11-08T14:42:36-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term=".net" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">From &lt;a href=&quot;http://limingxu.com/blogs/xu_java_chronicle/archive/2007/02/20/434.aspx&quot;&gt;Java to .NET, Back To Java Again, My Little Impression of The Two&lt;/a&gt;:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Having said all these, integration of various java projects together really do take a lot of Java people&apos;s time, it&apos;s no joke, but it&apos;s not desperate. For example, the open source project &quot;AppFuse&quot; does a fantastic job integrating various frameworks for us, I strongly encourage everyone to give it a shot and see how much time it saves you.
&lt;br/&gt;&lt;br/&gt;
So which platform do I like? My impression is Java offers a lot flexibility and choices, but at the same time introduced the &quot;Paradox of Choices&quot;, having so many things and integrate them together is no easy task, it simply overwhelm the human brains. .NET on the other hand is in a controlled environment, less choices, but easy to develop.
&lt;/p&gt;
&lt;p&gt;In other words: Java development is &lt;em&gt;way&lt;/em&gt; more complicated than .NET ... unless you use AppFuse. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/database_profiles_in_appfuse_2</id>
        <title type="html">Database Profiles in AppFuse 2.0</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/database_profiles_in_appfuse_2"/>
        <published>2007-02-14T17:41:37-07:00</published>
        <updated>2009-02-24T19:17:28-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="postgresql" scheme="http://roller.apache.org/ns/tags/" />
        <category term="mysql" scheme="http://roller.apache.org/ns/tags/" />
        <category term="sqlserver" scheme="http://roller.apache.org/ns/tags/" />
        <category term="oracle" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hsqldb" scheme="http://roller.apache.org/ns/tags/" />
        <category term="derby" scheme="http://roller.apache.org/ns/tags/" />
        <category term="h2" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last night, I added several &lt;a href=&quot;http://issues.appfuse.org/browse/APF-584&quot;&gt;database profiles&lt;/a&gt; to &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse 2.0&lt;/a&gt; and its archetypes.  What does this mean?  It means AppFuse should work out-of-the-box with several databases, including:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;H2&lt;/li&gt;
&lt;li&gt;HSQLDB&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;SQL Server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, here&apos;s how to test a new AppFuse project works with &lt;a href=&quot;http://www.h2database.com&quot;&gt;H2&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;
mvn archetype:create -DarchetypeGroupId=org.appfuse -DarchetypeArtifactId=appfuse-basic-struts -DremoteRepositories=http://static.appfuse.org/repository -DarchetypeVersion=1.0-m4-SNAPSHOT -DgroupId=com.mycompany -DartifactId=myproject
&lt;/pre&gt;
&lt;blockquote style=&quot;font-style: italic&quot;&gt;
Yeah, I wish there was a way to shorten this command (or prompt for choices) too.
&lt;/blockquote&gt;
&lt;p&gt;
After doing this, you can cd into the &quot;myproject&quot; directory and run &lt;strong&gt;mvn integration-test -Ph2&lt;/strong&gt;. AppFuse 2.0 projects are configured for MySQL by default, so if you want to permanently activate one of these profiles, you can add the following between the &amp;lt;id&amp;gt; and &amp;lt;properties&amp;gt; section of the profile.&lt;/p&gt;
&lt;pre&gt;
    &amp;lt;activation&amp;gt;
        &amp;lt;activeByDefault&amp;gt;true&amp;lt;/activeByDefault&amp;gt;
    &amp;lt;/activation&amp;gt;
&lt;/pre&gt;
&lt;p&gt;In addition to the profiles listed above, I tried to get &lt;a href=&quot;http://www.nabble.com/AppFuse-2.0-with-Oracle-Express-tf3225784s2369.htm&quot;&gt;Oracle Express&lt;/a&gt; and &lt;a href=&quot;http://www.nabble.com/Issues-trying-to-use-Embedded-Derby-with-hibernate3-and-dbunit-tf3226221.html&quot;&gt;embedded Derby&lt;/a&gt; working. No dice on either one. I took a brief look at DB2 Express as well, but with a 400 MB download and 3 JARs required for its JDBC Driver - it seemed like a lot more trouble than it was worth.&lt;br/&gt;&lt;br/&gt;
Maven 2&apos;s &lt;a href=&quot;http://maven.apache.org/guides/introduction/introduction-to-profiles.html&quot;&gt;build profiles&lt;/a&gt; are a powerful feature that we hope to make easy to use. For example, to test your new project with H2 and JBoss, you can simply run &lt;strong&gt;mvn integration-test -Ph2,jboss&lt;/strong&gt;. Thanks to the power of &lt;a href=&quot;http://cargo.codehaus.org&quot;&gt;Cargo&lt;/a&gt;, this will download JBoss 4.0.5, install it, and run all the Canoo WebTests within it. Of course, this will take a while the first time - especially since JBoss is a 77MB download. Fortunately, we allow you to &lt;a href=&quot;http://appfuse.org/display/APF/FAQ#FAQ-useexistingtomcat&quot;&gt;change one small setting&lt;/a&gt; in your pom.xml and use an existing install instead. 
&lt;/p&gt;
&lt;p&gt;Maven 2 is a kick-ass build/deploy/test tool once you figure it out. With AppFuse 2.0, we&apos;re doing all the &quot;figuring out&quot; for you. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;
&lt;/p&gt;
&lt;p style=&quot;font-style: italic&quot;&gt;NOTE: I would add more server profiles, but Cargo&apos;s Maven Plugin (version 0.2) has issues with &lt;a href=&quot;http://www.nabble.com/Cargo-and-Geronimo-1.1%2B-tf2864206.html#a8004094&quot;&gt;Geronimo 1.1&lt;/a&gt;, &lt;a href=&quot;http://www.nabble.com/Issues-with-Maven-2%2C-Cargo-and-Jetty-tf2661661.html#a7424029&quot;&gt;Jetty 6.x&lt;/a&gt; and &lt;a href=&quot;http://www.nabble.com/Configuring-Resin-3.x-to-be-aware-of-Spring-2.0-tf3177755.html&quot;&gt;Resin 3.x&lt;/a&gt;. Strangely enough, Jetty&apos;s Maven Plugin version 6.0.0 works great, but 6.1.0 throws &lt;a href=&quot;http://issues.appfuse.org/browse/APF-647&quot;&gt;stack traces&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Support for Oracle and Derby (in networked mode) has been added. We&apos;ll consider adding support for DB2 if IBM can figure out how to package their JDBC Driver into a single JAR.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_m3_released</id>
        <title type="html">AppFuse 2.0 M3 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_m3_released"/>
        <published>2007-02-06T14:16:45-07:00</published>
        <updated>2007-02-10T20:07:57-07:00</updated> 
        <category term="/Java" label="Java" />
        <content type="html">The AppFuse team is pleased to announce the release of AppFuse 2.0 M3! This release marks a milestone in our documentation efforts. We&apos;ve completed all of the &lt;a href=&quot;http://appfuse.org/display/APF/Web&quot;&gt;web framework tutorials&lt;/a&gt; and ensured that all the archetypes work properly. Turkish language support was added and native2ascii was integrated so all i18n bundles should work properly.
&lt;br/&gt;&lt;br/&gt;
The major things missing from this release are code generation (AppGen) and web services (XFire) support. We hope to add both of these before the final release.
&lt;br/&gt;&lt;br/&gt;
AppFuse 2.0 is available as a Maven archetype. For information on creating a new project using this release, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
The 2.0 series of AppFuse has a minumum requirement of the following specification versions:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Java Servlet 2.4 and JavaServer Pages (JSP) 2.0&lt;/li&gt;
&lt;li&gt;Java 2 Standard Platform Edition (J2SE) 5.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
For more information, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0+M3&quot;&gt;2.0 M3 Release Notes&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
We appreciate the time and effort everyone has put toward contributing code and documentation, posting to the mailing lists, and logging issues. We also greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://cenqua.com/&quot;&gt;Cenqua&lt;/a&gt;, &lt;a href=&quot;http://contegix.com/&quot;&gt;Contegix&lt;/a&gt;, &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt;, &lt;a href=&quot;http://www.java.net&quot;&gt;Java.net&lt;/a&gt; and &lt;a href=&quot;http://kgbinternet.com/&quot;&gt;KGBInternet&lt;/a&gt;.  Without them, working on this project wouldn&apos;t be nearly as much fun. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</content>
    </entry>
</feed>

