<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sonatype Blog &#187; Community</title>
	<atom:link href="http://www.sonatype.com/people/tag/community/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sonatype.com/people</link>
	<description>Sonatype is transforming software development with tools, information and services that enable organizations to build better software, faster, using open-source components.</description>
	<lastBuildDate>Wed, 23 May 2012 14:24:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Nexus Stories From Across The Globe</title>
		<link>http://www.sonatype.com/people/2012/05/nexus-stories-from-across-the-globe/</link>
		<comments>http://www.sonatype.com/people/2012/05/nexus-stories-from-across-the-globe/#comments</comments>
		<pubDate>Thu, 03 May 2012 12:38:02 +0000</pubDate>
		<dc:creator>Emily Blades</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Nexus]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=11120</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2012/05/nexus-stories-from-across-the-globe/' addthis:title='Nexus Stories From Across The Globe '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>With nearly 19,000 active instances of Nexus around the world, we thought we would reach out and ask the community to share their Nexus stories and experiences with us. Over the last six weeks we held our Nexus Stories Contest and we were blown away by the tremendous response we received from around the globe. [...]]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2012/05/nexus-stories-from-across-the-globe/' addthis:title='Nexus Stories From Across The Globe '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p><a rel="attachment wp-att-11136"><img class="aligncenter size-full wp-image-11136" title="blog_header_NexusStories-1" src="http://www.sonatype.com/people/wp-content/uploads/2012/05/blog_header_NexusStories-1.png" alt="" width="700" height="200" /></a></p>

<p>With nearly 19,000 active instances of Nexus around the world, we thought we would reach out and ask the community to share their Nexus stories and experiences with us. Over the last six weeks we held our Nexus Stories Contest and we were blown away by the tremendous response we received from around the globe.</p>

<p>Thank you to all of you who took the time to participate. We hope you are all enjoying your wicked awesome Nexus mugs! As promised, we will be sharing your Nexus stories on our blog over the coming weeks.</p>

<p>After the overwhelming response we received, we decided drawing one grand prize winner just wasn&#8217;t good enough (plus we love to take advantage of Jason every chance we get). So we decided to draw three grand prize winners!  Our three lucky winners will each be receiving one day of onsite consulting with Jason van Zyl. Our grand prize winners are:</p>

<ul>
    <li>Alexis Morelle, Colombes, France</li>
    <li>Rueben Jimenez, San Francisco, CA</li>
    <li>Henry Hughes, Los Angeles, CA</li>
</ul>

<p>Congratulations to our winners and thanks again to everyone who participated!</p>

<p>Stay tuned next week, when we will be sharing some of your stories on what life was like, before Nexus.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2012/05/nexus-stories-from-across-the-globe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bringing Java and Linux together on the way to Continuous Live Deployment</title>
		<link>http://www.sonatype.com/people/2011/11/bringing-java-and-linux-together-on-the-way-to-continuous-live-deployment/</link>
		<comments>http://www.sonatype.com/people/2011/11/bringing-java-and-linux-together-on-the-way-to-continuous-live-deployment/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 16:38:12 +0000</pubDate>
		<dc:creator>Sebastian Herold</dc:creator>
				<category><![CDATA[Nexus]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Guest]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=9581</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2011/11/bringing-java-and-linux-together-on-the-way-to-continuous-live-deployment/' addthis:title='Bringing Java and Linux together on the way to Continuous Live Deployment '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Today we have a guest post from Sebastian Herold, a software architect at ImmobilienScout24, the largest German online marketplace for real estate. Sebastian and his team created a YUM plugin for Nexus to better interface between the Java and Linux worlds. &#160; In 2010 we switched our build infrastructure to Apache Maven, Sonatype Nexus and [...]]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2011/11/bringing-java-and-linux-together-on-the-way-to-continuous-live-deployment/' addthis:title='Bringing Java and Linux together on the way to Continuous Live Deployment '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><div><em>Today we have a guest post from Sebastian Herold, a software architect at ImmobilienScout24, the largest German online marketplace for real estate. Sebastian and his team created a YUM plugin for Nexus to better interface between the Java and Linux worlds.</em>
<em><span id="more-9581"></span></em>
&nbsp;

In 2010 we switched our build infrastructure to Apache Maven, Sonatype Nexus and JetBrains TeamCity.  We then focused on the other side of our delivery pipeline, deployment. Linux package managers, like RPM, bring everything you need: compression, cleanup, unique file ownership, install/post-install scripts and fine-grained dependency management. We thought, why not deploy Java applications via RPM to our Linux-based data centers?

We knew that the <a href="http://mojo.codehaus.org/rpm-maven-plugin/">RPM Maven Plugin</a> made it easy to build an RPM in Maven’s package phase and to register it as a project artifact. <a rel="attachment wp-att-9583" href="http://www.sonatype.com/people/2011/11/bringing-java-and-linux-together-on-the-way-to-continuous-live-deployment/cld-at-is24/"><img class="alignright size-full wp-image-9583" title="Development Infrastructure using Linux and Nexus" src="http://www.sonatype.com/people/wp-content/uploads/2011/11/CLD-at-IS24.png" alt="Development Infrastructure using Linux and Nexus" width="329" height="222" /></a>With the help of Maven it would be automatically deployed to Nexus. The only question we had was how to transform Nexus Maven repositories into YUM repositories.  In case you didn’t know, YUM is an automatic updater and package installer/remover for RPM systems.

Nexus is open source, so we decided to build a plugin. The design was quite easy. We just listen to <em>RepositoryItemEventStore</em> and every time we detect that an RPM package gets stored, we execute the Linux command <em>createrepo</em> to generate the YUM repository. This works out very well for us. Nexus repository URLs like <span style="text-decoration: underline;">http://nexus:8081/nexus/content/repositories/releases</span> also become YUM repository urls in your <em>/etc/yum.repos.d/*.repo</em> files.  In combination with TeamCity and a cronjob doing <em>YUM upgrades</em> every minute on the production servers, Continuous Live Deployment (CLD) becomes a simple task of configuring the right URLs.  Of course, it’s not quite that simple as I’ve skipped the details.  If you want to learn more about our architecture, you can check out this <a title="Continuous Deployment Presentation" href="http://velocityconf.com/velocityeu/public/schedule/detail/21669" target="_blank">presentation</a> from one of my colleagues.

<em>
</em>

</div>

<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2011/11/bringing-java-and-linux-together-on-the-way-to-continuous-live-deployment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to publish your Gradle project to the Central Repository</title>
		<link>http://www.sonatype.com/people/2011/11/how-to-publish-your-gradle-project-to-the-central-repository/</link>
		<comments>http://www.sonatype.com/people/2011/11/how-to-publish-your-gradle-project-to-the-central-repository/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 15:37:38 +0000</pubDate>
		<dc:creator>Terry Bernstein</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[How-To]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[Gradle]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=9514</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2011/11/how-to-publish-your-gradle-project-to-the-central-repository/' addthis:title='How to publish your Gradle project to the Central Repository '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Sonatype makes it easy to add your projects to the Central Repository with a free, public hosting service called OSSRH, that we recently wrote about here.  Many developers have found this a very useful service and easy to use with Apache Maven.  However, if you&#8217;ve started using Gradle, you may have wondered if you could [...]]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2011/11/how-to-publish-your-gradle-project-to-the-central-repository/' addthis:title='How to publish your Gradle project to the Central Repository '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>Sonatype makes it easy to add your projects to the <a title="Central Repository" href="http://search.maven.org/">Central Repository</a> with a free, public hosting service called OSSRH, that we recently wrote about <a title="Blog on Sonatype OSSRH" href="http://www.sonatype.com/people/2011/10/publishing-your-artifacts-to-the-central-repository/">here</a>.  Many developers have found this a very useful service and easy to use with Apache Maven.  However, if you&#8217;ve started using Gradle, you may have wondered if you could continue using the service.  The answer is absolutely YES.</p>

<p>We were talking about creating a guide for this, but someone in the community beat us to it.  Yennick Trevels published an excellent guide in his blog that you can find <a href="http://jedicoder.blogspot.com/2011/11/automated-gradle-project-deployment-to.html">here</a>.  We highly recommend checking out his post if you want to use Gradle to deploy artifacts to the Central Repository.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2011/11/how-to-publish-your-gradle-project-to-the-central-repository/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Our Focus on Advancing Hudson and Making Great Software</title>
		<link>http://www.sonatype.com/people/2011/02/our-focus-on-advancing-hudson-and-making-great-software/</link>
		<comments>http://www.sonatype.com/people/2011/02/our-focus-on-advancing-hudson-and-making-great-software/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 02:48:02 +0000</pubDate>
		<dc:creator>Wayne Jackson</dc:creator>
				<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=7277</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2011/02/our-focus-on-advancing-hudson-and-making-great-software/' addthis:title='Our Focus on Advancing Hudson and Making Great Software '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Sonatype’s perspective regarding the Hudson Project is pretty simple: we have been and will continue to be committed to advancing Hudson and making better software available to the community of Hudson users. Very recently, Sonatype completed significant development in the evolution of Hudson&#8217;s core architecture. The benefits of these changes include better leveraging of industry [...]]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2011/02/our-focus-on-advancing-hudson-and-making-great-software/' addthis:title='Our Focus on Advancing Hudson and Making Great Software '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p><!--dzoneZ=none-->Sonatype’s perspective regarding the Hudson Project is pretty simple: we have been and will continue to be committed to advancing Hudson and making better software available to the community of Hudson users.</p>

<p>Very recently, Sonatype completed significant development in the evolution of Hudson&#8217;s core architecture. The benefits of these changes include better leveraging of industry standards, increased performance and stability, and tight integration with Maven 3 that provides greater visibility into running builds. We are continuing to add engineers to our Hudson team and are working hard with the Hudson community to move much of the work we&#8217;ve done here to Java.net.</p>

<p>Our work on Hudson is consistent with Sonatype’s long history of investment and community support. Our work with Maven at the Apache Software Foundation, with m2eclipse at the Eclipse Foundation, and with Nexus (our open source repository manager) all underscore our commitment to innovation for open source and commercial users alike.</p>

<p>Are we a commercial enterprise? Absolutely. However, our track record of open source innovation and community contribution speaks for itself. At Sonatype, we&#8217;ve always focused on the code, and that&#8217;s where we&#8217;re focused today with Hudson.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2011/02/our-focus-on-advancing-hudson-and-making-great-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Next Generation Maven Development Stack @ JFokus</title>
		<link>http://www.sonatype.com/people/2010/01/next-generation-maven-development-stack/</link>
		<comments>http://www.sonatype.com/people/2010/01/next-generation-maven-development-stack/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 05:21:05 +0000</pubDate>
		<dc:creator>Jason van Zyl</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[m2eclipse]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[GIT]]></category>
		<category><![CDATA[guice]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[jfokus]]></category>
		<category><![CDATA[peaberry]]></category>
		<category><![CDATA[polyglot]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=4113</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/next-generation-maven-development-stack/' addthis:title='Next Generation Maven Development Stack @ JFokus '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>For my talk today at JFokus today I&#8217;ve taken the liberty of starting some notes for folks interested in attending. There&#8217;s a lot to cover and so I thought I would try the approach of providing some material up front so the session can be more of a dialog. I&#8217;m going to attempt to cover [...]]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/next-generation-maven-development-stack/' addthis:title='Next Generation Maven Development Stack @ JFokus '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>For my talk today at JFokus today I&#8217;ve taken the liberty of starting some notes for folks interested in attending. There&#8217;s a lot to cover and so I thought I would try the approach of providing some material up front so the session can be more of a dialog. I&#8217;m going to attempt to cover everything in the picture below and save the demos folks might want to see for the Sonatype booth. Happy to chat with folks and do any demos before and after the presentation. Just stop by!</p>

<p><img src="http://www.sonatype.com/people/wp-content/uploads/2010/01/Stack1.png" alt="Stack.png" border="0" /></p>

<h3>Maven Stack Infrastructure</h3>

<p>I&#8217;m going to talk about some of the under pinnings of the technologies we&#8217;re using as part of our Maven work. Why we selected the technologes and some of the current work that&#8217;s happening.
<span id="more-4113"></span></p>

<ul>
<li><a href="http://code.google.com/p/google-guice/">Guice</a></li>
<li><a href="http://www.sonatype.com/people/2010/01/from-plexus-to-guice-1-why-guice/">From Plexus to Guice (#1): Why Guice?</a></li>
<li><a href="http://www.sonatype.com/people/2010/01/from-plexus-to-guice-2-the-guiceplexus-bridge-and-custom-bean-injection/">From Plexus to Guice (#2): The Guice/Plexus Bridge and Custom Bean Injection</a></li>
<li><a href="http://www.sonatype.com/people/2010/01/from-plexus-to-guice-3-creating-a-guice-bean-extension-layer/">From Plexus to Guice (#3): Creating a Guice Bean Extension Layer</a></li>
<li><a href="http://code.google.com/p/peaberry/">Peaberry</a></li>
<li><a href="http://incubator.apache.org/shiro/">Apache Shiro</a></li>
<li><a href="http://enunciate.codehaus.org/">Enunciate</a></li>
</ul>

<h3>Maven</h3>

<p>There are several develops going on in the various Maven projects. Maven 3.x is on the way, but we have some very interesting work happing with OSGi within our Tycho project. The Flexmojos project and NAR (the C/++ framework for Maven) are also popular.</p>

<h4>Tycho</h4>

<ul>
<li><a href="http://tycho.sonatype.org/">Tycho Site</a></li>
<li><a href="http://github.com/sonatype/sonatype-tycho">Tycho @ Github</a></li>
<li><a href="http://github.com/sonatype/m2eclipse-tycho">Tycho/PDE Integration</a></li>
<li><a href="http://wiki.eclipse.org/Equinox_p2">P2 Site</a></li>
</ul>

<h4>Flexmojos</h4>

<ul>
<li><a href="http://flexmojos.sonatype.org/">Flexmojos Site</a></li>
</ul>

<h4>NAR</h4>

<ul>
<li><a href="http://duns.github.com/maven-nar-plugin/">NAR Site</a></li>
<li><a href="http://github.com/sonatype/maven-nar-plugin">NAR @ Github</a></li>
</ul>

<h3>M2Eclipse</h3>

<p>The primary IDE integration we work on at Sonatype. The most important thing to talk about in M2Eclipse is the configuration framework.</p>

<ul>
<li><a href="http://m2eclipse.sonatype.org/">M2Eclipse Site</a></li>
</ul>

<h3>Hudson</h3>

<p>Most of the work we&#8217;ve been doing on Hudson is still not really good enough for public consumption but we&#8217;re testing the changes we&#8217;re making on the Sonatype grid.</p>

<p><a href="https://hudson.dev.java.net/">Hudson Site</a></p>

<h3>Nexus</h3>

<ul>
<li><a href="http://nexus.sonatype.org">Nexus Site</a></li>
<li><a href="http://www.sonatype.com/people/2010/01/nexus-oss-ecosystem/">Nexus: Improving Maven Central and Supporting the Maven Ecosystem</a></li>
<li><a href="http://www.sonatype.com/people/2010/01/10-questions/">Selecting OSS Software: 10 Questions Answered for Sonatype Nexus</a></li>
<li><a href="http://nexus.sonatype.org/oss-repository-hosting.html">OSS Repository Hosting</a></li>
<li><a href="http://bundles.sonatype.org/index.html#welcome">OSGi Central</a></li>
<li>Ruby Central (We&#8217;re working on making that publicly available</li>
</ul>

<h3>Proviso</h3>

<p>Proviso is not publicly released yet, but Alin and I have been working together to get our provisioning framework ready for a public release.</p>

<h3>Git</h3>

<p>We are starting to use Git heavily and soon likely exclusively. We are helping out on the EGit, and JGit projects at Eclipse and we&#8217;re trying to put a little Git server together based on JGit, MINA, and Apache Shiro.</p>

<ul>
<li><a href="http://www.eclipse.org/jgit/">JGit Site</a></li>
<li><a href="http://www.eclipse.org/egit/">EGit Site</a></li>
<li><a href="http://aniszczyk.org/2010/01/25/egit-and-jgit-builds-available/">Tycho building EGit/JGit</a></li>
<li><a href="http://github.com/sonatype/sshjgit">SShJGit @ Github</a></li>
</ul>

<h3>Maven Extensions</h3>

<p>I&#8217;ll chat about these in the talk.</p>

<ul>
<li><a href="http://polyglot.sonatype.org/">Polyglot Maven Site</a></li>
<li><a href="http://github.com/sonatype/polyglot-maven">Polyglot Maven @ Github</a></li>
<li><a href="http://mvnsh.sonatype.org">Maven Shell</a></li>
<li><a href="https://github.com/sonatype/mvnsh">Maven Shell @ Github</a></li>
</ul>

<p>I&#8217;ll likely keep adding to the entry leading up the talk, but I thought I would get the ball rolling!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/01/next-generation-maven-development-stack/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meet the Nexus Remote Repository Browsing Plugin</title>
		<link>http://www.sonatype.com/people/2010/01/meet-the-nexus-remote-repository-browsing-plugin/</link>
		<comments>http://www.sonatype.com/people/2010/01/meet-the-nexus-remote-repository-browsing-plugin/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 05:10:22 +0000</pubDate>
		<dc:creator>Anders Hammar</dc:creator>
				<category><![CDATA[Nexus]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=4084</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/meet-the-nexus-remote-repository-browsing-plugin/' addthis:title='Meet the Nexus Remote Repository Browsing Plugin '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Having used Nexus since it was a beta release and having also written a Plexus component-style Nexus plugin (the nexus-ldap realm), I was curious about the new Nexus Plugin API introduced in Nexus 1.4.0. To try it out, I asked two of our developers here at Devoteam Sweden to develop the Nexus Remote Repository Browsing [...]]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/meet-the-nexus-remote-repository-browsing-plugin/' addthis:title='Meet the Nexus Remote Repository Browsing Plugin '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/01/nexus-small.png"><img class="alignright size-full wp-image-3683" title="nexus-small" src="http://www.sonatype.com/people/wp-content/uploads/2010/01/nexus-small.png" alt="" width="250" height="62" /></a>Having used Nexus since it was a beta release and having also written a Plexus component-style Nexus plugin (the nexus-ldap realm), I was curious about the new Nexus Plugin API introduced in Nexus 1.4.0. To try it out, I asked two of our developers here at <a href="http://www.devoteam.se/">Devoteam Sweden</a> to develop the Nexus Remote Repository Browsing Plugin &#8211; a Nexus plugin that makes it possible to directly browse the remote Maven repository of a proxy repository within the Nexus UI. The plugin has been contributed to Nexus OSS and will be released as a part of the upcoming 1.5.0 release.  In this blog post, I will talk a little bit about the plugin and its use case.<span id="more-4084"></span></p>

<p>In the Repository panel of Nexus, there are two tabs for browsing artifacts. The first one is called “Browse Storage” and is used to browse all artifacts stored/cached locally by the Nexus instance. For a hosted repository, the tree displayed under &#8220;Browse Storage&#8221; will contain all available artifacts. For a proxy repository, you will only find those artifacts that have been cached due to earlier requests. The second tab, “Browse Index”, allows you to browse artifacts through the repository’s index.  If the remote repository provides an up-to-date index and you have configured Nexus to download this remote index, all of the artifacts in the remote repository will be visible under the &#8220;Browse Index&#8221; tab.   While the &#8220;Browse Index&#8221; tab works for all of the major public Maven repositories, it doesn&#8217;t allow you to browse remote repositories which do not publish a Nexus index.</p>

<p>This is where the Nexus Remote Repository Browsing Plugin (nexus-rrb-plugin) comes into play. The plugin adds a third browsing tab for proxy repositories, the “Browse Remote” tab. In this tab, it is possible to browse the actual remote repository from within the Nexus UI. Below you find a screen shot of the new tab.</p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/01/rrb-plugin1.png"><img class="aligncenter size-full wp-image-4091" title="rrb-plugin" src="http://www.sonatype.com/people/wp-content/uploads/2010/01/rrb-plugin1.png" alt="" width="622" height="461" /></a></p>

<p>Before this plugin, the user was forced to browse the remote repository in a separate browser window. Not only is this inconvenient, but for many users it is not possible as the URL of the remote repository is normally only visible to administrators. Also, the connection to the remote repository will be initiated from the Nexus instance. The benefit of this is that it will work even if your network setup prevents direct access from the clients to the remote repository.</p>

<p>This first version of the plugin doesn&#8217;t add any bells and whistles to the browsing. The tab is added to all proxy repositories and is available to all users. However, it does support browsing of Maven repositories at S3, such as the SpringSource repository.  This ability to browse a repository hosted on S3 is significant as it is tricky to do this via a normal web browser.</p>

<p>As mentioned above, the nexus-rrb-plugin is included as a core plugin in the upcoming Nexus 1.5.0 release.   This means that it will be available as a part of the core Nexus OSS offering.   Once Nexus 1.5.0 is released, please try it out and use the <a href="https://issues.sonatype.org/browse/NEXUS">issue tracker</a> for reporting any problems you run into and enhancements you would like to see &#8211; we’re especially interested in hearing about repositories that the plugin cannot handle! Questions and discussions may be posted to the <a href="http://nexus.sonatype.org/project-information.html">Nexus mailing list</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/01/meet-the-nexus-remote-repository-browsing-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>From Plexus to Guice (#2): The Guice/Plexus Bridge and Custom Bean Injection</title>
		<link>http://www.sonatype.com/people/2010/01/from-plexus-to-guice-2-the-guiceplexus-bridge-and-custom-bean-injection/</link>
		<comments>http://www.sonatype.com/people/2010/01/from-plexus-to-guice-2-the-guiceplexus-bridge-and-custom-bean-injection/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 08:00:05 +0000</pubDate>
		<dc:creator>Stuart McCulloch</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[pom]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=3947</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/from-plexus-to-guice-2-the-guiceplexus-bridge-and-custom-bean-injection/' addthis:title='From Plexus to Guice (#2): The Guice/Plexus Bridge and Custom Bean Injection '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>In the next few articles of the &#8220;Plexus to Guice&#8221; series I will look at the modular design of our replacement Plexus container and show how you can configure a POB (Plain Old Bean) from Guice with a simple code example. In the first article of this series, Jason discussed the need to move to [...]]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/from-plexus-to-guice-2-the-guiceplexus-bridge-and-custom-bean-injection/' addthis:title='From Plexus to Guice (#2): The Guice/Plexus Bridge and Custom Bean Injection '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/01/from-plexus-to-guice1.png"><img class="alignright size-full wp-image-4024" title="from-plexus-to-guice" src="http://www.sonatype.com/people/wp-content/uploads/2010/01/from-plexus-to-guice1.png" alt="" width="250" height="62" /></a>In the next few articles of the &#8220;Plexus to Guice&#8221; series I will look at the modular design of our replacement Plexus container and show how you can configure a POB (Plain Old Bean) from Guice with a simple code example.   In the <a href="http://www.sonatype.com/people/2010/01/from-plexus-to-guice-1-why-guice/">first article</a> of this series, Jason discussed the need to move to a more widely used and support container, and the reasons why we chose to standardize on Guice.   As we migrate more Plexus-based applications (such as Maven) to Guice, we still to maintain backward-compatibility for all of the plugins and extensions which were developed using Plexus.  In this post, I start to discuss the scope and initial efforts to create something we&#8217;re calling the Guice/Plexus &#8220;shim&#8221;.   It is a library, a &#8220;container&#8221; that was developed to allow existing Plexus components to use Guice under the hood without any modification. <span id="more-3947"></span></p>

<h3>Scope, Architecture, and Conventions</h3>

<p>Our goal is to create a swap-in replacement for <a href="http://plexus.codehaus.org/plexus-containers/plexus-container-default/">Plexus</a> built on top of <a href="http://code.google.com/p/google-guice/">Guice</a>. Ideally this should be done without changing the core Guice code, but if this is not possible then any fixes or new functionality should be written up and reported on the Guice <a href="http://code.google.com/p/google-guice/issues/list">issues</a> page.   While there is no guarantee that these changes will make it into an official Guice release, improvements that benefit a wider audience should have a better chance of making it into Guice.</p>

<p>Sonatype currently maintains a <a href="http://svn.sonatype.org/spice/trunk/spice-inject/guice-patches">patched build</a> of Guice trunk with the following major patches:</p>

<ul>
    <li><a href="http://code.google.com/p/google-guice/issues/detail?id=436">Provide access to Guice&#8217;s own internal TypeConverters</a></li>
    <li><a href="http://code.google.com/p/google-guice/issues/detail?id=343">BytecodeGen and related AOP / bridge classloader fixes</a></li>
</ul>

<p>This build also contains some experimental changes which have not yet been written up because they are still being tested:</p>

<ul>
    <li>ability to turn off validation error about using @Singleton on an interface instead of an implementation class</li>
    <li>ability to turn off creation of parent JIT bindings when using child injectors (simplified version of <a rel="nofollow" href="http://code.google.com/p/google-guice/issues/detail?id=342">this issue</a>)</li>
</ul>

<h3>Guice/Plexus Integration Module Architecture</h3>

<p>The solution is separated into re-usable, pluggable modules that together provide a replacement for the existing Plexus container. There is also an artifact that combines these modules into a single JAR, as this would make it easier to swap between the old and new container. Each module has a specific responsibility and any dependencies between modules is kept at a minimum.   The following is a list of the components or modules that comprise the Guice/Plexus integration project.</p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/01/guice-plexus-shim.png"><img class="size-full wp-image-3951 alignright" title="guice-plexus-shim" src="http://www.sonatype.com/people/wp-content/uploads/2010/01/guice-plexus-shim.png" alt="" width="337" height="301" /></a></p>

<dl> <dt>guice-bean-inject</dt> <dd>Extends Guice to support customized injection of named properties (fields and setter methods).</dd> <dt>guice-bean-reflect</dt> <dd>Provides utility methods and support code for reflection, bean properties, and resource scanning.</dd> <dt>guice-plexus-metadata</dt> <dd>Shared metadata interfaces, runtime implementations of Plexus annotations, and collection adapters.</dd> <dt>guice-plexus-scanners</dt> <dd>Annotation and XML scanners that provide metadata about components, requirements, and configuration.</dd> <dt>guice-plexus-converters</dt> <dd>Standard Plexus type conversion rules that can create instances from simple strings and XML markup.</dd> <dt>guice-plexus-locators</dt> <dd>Guice based registry that can locate components of a certain type, optionally ordered by name hints.</dd> <dt>guice-plexus-bindings</dt> <dd>Guice <a rel="nofollow" href="http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Module.html">module</a> that uses: scanners to find and bind Plexus component beans, converters to turn configurations into instances, and locators to find components based on requirements. This component also provides a simple lifecycle management API.</dd> <dt>guice-plexus-shim</dt> <dd>Creates an <a rel="nofollow" href="http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Injector.html">injector</a> with Plexus bean support, adds Plexus lifecycles, and provides the container API.</dd> </dl>

<h2>A Brief introduction to Guice and JSR330</h2>

<p><a rel="nofollow" href="http://code.google.com/p/google-guice/">Guice</a> is a <a rel="nofollow" href="http://martinfowler.com/articles/injection.html">Dependency Injection</a> framework that injects constructors, methods, and fields annotated with @Inject. Guice recognizes both the <a rel="nofollow" href="http://atinject.googlecode.com/svn/trunk/javadoc/javax/inject/Inject.html">JSR 330</a> and the original <a rel="nofollow" href="http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Inject.html">Guice</a> form of this annotation.</p>

<p>Every injection point (constructor, method, or field) has a number of dependencies, each one represented by a key: the type to be injected plus an optional qualifier annotation that lets you choose between different implementations of the same type. For example:</p>

<div>
<div>
<pre>public class Car {
   // Injectable constructor
   @Inject public Car(Engine engine) { ... }

   // Injectable field
   @Inject @Named("Corinthian Leather") private Seat seat;

   // Injectable package-private method
   @Inject void install(Windshield windshield, Trunk trunk) { ... }
}</pre>
</div>
</div>

<p>Has the following injection points and dependency keys:</p>

<div>
<div>
<pre>Constructor      ---&gt; Key[ Engine ]
Field "seat"     ---&gt; Key[ Seat, @Named( "Corinthian Leather" ) ]
Method "install" ---&gt; Key[ Windshield ], Key[ Trunk ]</pre>
</div>
</div>

<p>The Guice injector maintains a set of bindings that map dependency keys to <a rel="nofollow" href="http://atinject.googlecode.com/svn/trunk/javadoc/javax/inject/Provider.html">providers</a> that supply instances of the key type. These providers may use different strategies to supply instances: per-lookup, singleton, per-conversation, even your own custom strategies.</p>

<p>When you configure Guice you are registering bindings from one key to another, or between keys and providers:</p>

<div>
<div>
<pre>// Key[ Seat ] ---&gt; Key[ FoamSeatImpl ]
bind( Seat.class ).to( FoamSeatImpl.class );

// Key[ Seat, @Named( "Corinthian Leather" ) ] ---&gt; Key[ LeatherSeatImpl ]
bind( Seat.class ).annotatedWith( Names.named( "Corinthian Leather" ) ).to( LeatherSeatImpl.class );

// Key[ Engine ] ---&gt; Key[ V8EngineImpl ]
bind( Engine.class ).to( V8EngineImpl.class );

// Key[ V8EngineImpl ] ---&gt; Provider[ V8EngineImpl, "singleton" ]
bind( V8EngineImpl.class ).in( Singleton.class );

// Key[ Windshield ] ---&gt; Provider[ Windshield, "custom" ]
bind( Windshield.class ).toProvider( WindshieldProvider.class );

// Key[ Trunk ] ---&gt; Provider[ TrunkImpl, "constant" ]
bind( Trunk.class ).toInstance( new TrunkImpl() );</pre>
</div>
</div>

<p>The injector can also create certain types of bindings on-demand when no such explicit binding already exists, such as:</p>

<div>
<div>
<pre>// Key[ FoamSeatImpl ] ---&gt; Provider[ FoamSeatImpl , "per-lookup" ]
// Key[ LeatherSeatImpl] ---&gt; Provider[ LeatherSeatImpl, "per-lookup" ]</pre>
</div>
</div>

<div>
<table><colgroup> <col width="24"></col> <col></col> </colgroup>
<tbody>
<tr>
<td valign="top"><img src="https://docs.sonatype.com/images/icons/emoticons/information.gif" border="0" alt="" width="16" height="16" align="absmiddle" /></td>
<td>The <tt>Key[...]</tt> and <tt>Provider[...]</tt> markup is pseudo-code</td>
</tr>
</tbody>
</table>
</div>

<p>So far so good, but what if you have classes that don&#8217;t mark dependencies with <tt>@Inject</tt>? What if they&#8217;re identified in XML or marked with custom annotations like <tt>@Requirement</tt> or <tt>@Configuration</tt>?</p>

<h2>TypeListeners, MembersInjectors, and InjectionListeners</h2>

<p>Since 2.0 Guice has provided a way to supplement the core injection process with your own <a rel="nofollow" href="http://code.google.com/p/google-guice/wiki/CustomInjections">custom injections</a>. Here&#8217;s what you need to do:</p>

<ol>
    <li>Register your custom <a rel="nofollow" href="http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/TypeListener.html">TypeListener</a>, using a <a rel="nofollow" href="http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/matcher/Matcher.html">Matcher</a> to filter the specific types you are interested in, or <a rel="nofollow" href="http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/matcher/Matchers.html">Matchers.any()</a> if you want to process all types</li>
    <li>Guice will call your TypeListener once for each type that matches your chosen matcher, passing you a <a rel="nofollow" href="http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/TypeEncounter.html">TypeEncounter</a></li>
    <li>You can then analyze the type to be injected, prepare any custom injection data, and use the TypeEncounter to register a<a rel="nofollow" href="http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/MembersInjector.html">MembersInjector</a> or <a rel="nofollow" href="http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/InjectionListener.html">InjectionListener</a> for this type. Because the TypeListener is called per-type, and not per-instance, you should try to do as much preparation work here as possible to avoid spending too much time in the MembersInjector or InjectionListener</li>
    <li>Guice will call your MembersInjector once for each instance it injects, after it has performed the core injection. You can then use the data prepared by your TypeListener to perform any custom injection</li>
    <li>Finally Guice will call your InjectionListener once for each instance it injects, after all injections are complete. This is where you can hook in management code, such as start and stop life-cycle support</li>
</ol>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/01/custom-injection.png"><img class="aligncenter size-full wp-image-4032" title="custom-injection" src="http://www.sonatype.com/people/wp-content/uploads/2010/01/custom-injection.png" alt="" width="349" height="301" /></a></p>

<p>You&#8217;ll notice that Guice does not dictate how each type should be scanned or prepared for custom injection. While Guice does provide utility methods that can tell you which class members are annotated with @Inject, there&#8217;s no general-purpose mechanism to scan class members looking for custom annotations. On the one hand this is good, because it avoids bloating the core JAR with code you might not need. But on the other hand each custom injection client could end up implementing similar scanning code again and again. The recommended approach is to put optional code like this in an extension library that people can use if they need to, rather than keep folding it into the core.</p>

<p>We&#8217;re going to use custom injection to support Plexus components whose dependencies may be annotated or configured in XML. Plexus components are similar to Java beans in that they can have fields or setter methods, so rather than write a custom injector that&#8217;s closely tied to Plexus let&#8217;s see if we can develop an extension library for &#8220;beans&#8221; in general. That way we can build support for Plexus on top of it, and allow people to re-use it for other bean-style injections.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/01/from-plexus-to-guice-2-the-guiceplexus-bridge-and-custom-bean-injection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>From Plexus to Guice (#1): Why Guice?</title>
		<link>http://www.sonatype.com/people/2010/01/from-plexus-to-guice-1-why-guice/</link>
		<comments>http://www.sonatype.com/people/2010/01/from-plexus-to-guice-1-why-guice/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 19:00:55 +0000</pubDate>
		<dc:creator>Jason van Zyl</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[guice]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[peaberry]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=3970</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/from-plexus-to-guice-1-why-guice/' addthis:title='From Plexus to Guice (#1): Why Guice? '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>When we started the Maven project, dependency injection was still developing. Spring was just starting out and the Avalon project at Apache was really the only IoC framework around. While the concept seems second-nature by 2010, in 2002, it wasn&#8217;t a primary focus of the initial efforts of the Maven community but it was something [...]]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/from-plexus-to-guice-1-why-guice/' addthis:title='From Plexus to Guice (#1): Why Guice? '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/01/from-plexus-to-guice1.png"><img class="alignright size-full wp-image-4024" title="from-plexus-to-guice" src="http://www.sonatype.com/people/wp-content/uploads/2010/01/from-plexus-to-guice1.png" alt="" width="250" height="62" /></a>When we started the Maven project, dependency injection was still developing. Spring was just starting out and the Avalon project at Apache was really the only IoC framework around. While the concept seems second-nature by 2010, in 2002, it wasn&#8217;t a primary focus of the initial efforts of the Maven community but it was something I felt had to be in place for the development of Maven 2. We knew we needed some sort of component framework, some standard mechanism to instantiate plugins and configure them based on a set of configuration points, and, at the time, Plexus filled the gap. Plexus was exactly what we needed because it evolved with the requirements of Maven, and I think that Plexus served us well for the past few years but it&#8217;s time to let go. I never felt compelled to switch until <a href="http://code.google.com/p/google-guice/wiki/Guice20">Guice 2.0</a>.   Guice has the capabilities and adaptability we require in Maven.</p>

<p>For all new development, we&#8217;ve decided to focus on <a href="http://code.google.com/p/google-guice/">Guice</a> and build a compatibility layer for existing components. In this post, I&#8217;m going to discuss the various factors that went into the decision to move to Guice. All of Sonatype&#8217;s product are currently developed using Guice and the Guice/Plexus integration libraries that Stuart will describe in the articles that will follow over the next few weeks, and future work on Maven 3 will be based on Guice.<span id="more-3970"></span></p>

<h3>Why Guice?</h3>

<p>We ultimately went with Guice because it provided a system that could be configured and customized at runtime. It was very close to the model that Plexus was using, and we felt that it would be easy for us to build a compatibility layer between the two. The primary motiviation in this decision was our ability to write that compatibility layer atop whatever framework we selected that would allow for backward-compatibility. You see, it isn&#8217;t good enough in a community this large to just move to a new framework and expect everyone to just scramble to rewrite Maven plugins. We had to find a way to support existing plugins, and existing extensions. We had to find a way to work with all of the existing code that was coded to Plexus and adapt that to a new engine.</p>

<p>Guice is highly adaptable. With Guice we don&#8217;t need to configure all of our components ahead of time, we can instantiate them as needed and modify the &#8220;context&#8221; with a Guice/Plexus integration layer which Stuart will describe in the following articles. The answer to &#8220;why Guice?&#8221; is explained in the code that was required to write this compatibility layer. The only way we found to make this work was by using Guice.     Other reasons included <a href="http://java.dzone.com/news/dependency-injection-and-type-">type safety</a>, <a href="http://code.google.com/p/garbagecollected/wiki/SpringAndGuiceErrors">easy-to-read error messages</a>, and <a href="http://code.google.com/p/peaberry/">OSGi support using peaberry</a>.    All of our development uses the <a href="http://code.google.com/p/atinject/">JSR330 standard @Inject anotations</a>.   We&#8217;re using JSR330 instead of Guice-specific annotations to make sure that our work is more standard and portable going forward.</p>

<h3>Focusing the Community</h3>

<p>Aside from the technical reasons to move to Guice, there are reasons that involve the community. If our audacious goal is to provide world-class build and development infrastructure support, we need to remove unnecessary distractions from our environment. We just were not focused on Plexus, and issues would come up in Plexus that needed to be supported which distracted from the core effort. We&#8217;re not just <em>using</em> Guice. Because we are starting to rely on it, we appreciate the need to work closely with a project like Guice and contribute back to that community.  Stuart is a committer, and we wanted to collaborate with others and use a framework used widely by others.</p>

<p>Maven&#8217;s goal was never to create a dependency injection framework, it was always focused on builds and the infrastructure that supports development. Not long ago, we were contemplating what it would take to improve Plexus, we looked at the effort required to document and support Plexus going forward, and it just didn&#8217;t make any sense for us to continue to apply precious time and effort to a problem that had already been solved by several others. It makes sense to focus the community, and moving to Guice will allow us to devote more of our own resources to supporting the central projects and products.</p>

<h3>Making it Easier to Extend</h3>

<p>When your project or production uses a standard tool, you increase the audience that can customize it. If the goal of Maven is to create a solid foundation of infrastructure for others to build upon, it only makes sense to adopt something more standard. Maven and products like Nexus should be judged by the number and variety of plugins that have been developed for them, and this is something that attract most new users to Maven (the abundance and variety of Maven plugins). Anything we can do to make it easier to extend these systems is the right thing to do for the &#8220;ecosystem&#8221; I described last week.</p>

<p>If you wanted to write a plugin for the initial version of Nexus two years ago, you would have had to know a lot about Plexus. There was nothing particularly wrong with Plexus, it had a well-defined interface and it served its purpose, but there wasn&#8217;t very much documentation, and requiring some knowledge of Plexus for plugin developers was reducing the size of potential developers. In the past year, we&#8217;ve made a course correction, and you can write a Nexus plugin without having to learn any dependency injection framework. What has made this transition possible is the flexibility of Guice.</p>

<h3>Summary</h3>

<p>Stuart&#8217;s going to dive into the technical details in the next five parts of this series. If you are a developer interested in the implementation of Plexus and Guice, you&#8217;ll find these posts to be a good starting point for learning about we&#8217;ve implemented this compatibility layer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/01/from-plexus-to-guice-1-why-guice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven over Ant + Ivy: A Team Perspective by Les Hazlewood</title>
		<link>http://www.sonatype.com/people/2010/01/maven-over-ant-ivy-a-team-perspective-by-les-hazlewood/</link>
		<comments>http://www.sonatype.com/people/2010/01/maven-over-ant-ivy-a-team-perspective-by-les-hazlewood/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 16:03:29 +0000</pubDate>
		<dc:creator>Jason van Zyl</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[ivy]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=3909</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/maven-over-ant-ivy-a-team-perspective-by-les-hazlewood/' addthis:title='Maven over Ant + Ivy: A Team Perspective by Les Hazlewood '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Les Hazlewood has an objective summary of why he eventually came around to deciding that Maven is a better overall solution then Ant + Ivy. This is an evolution in thought process that we, Sonatype, often see in enterprises and Les has two blog entries that illustrate this evolution perfectly. Maven 2 vs Ant+Ivy: Our [...]]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/maven-over-ant-ivy-a-team-perspective-by-les-hazlewood/' addthis:title='Maven over Ant + Ivy: A Team Perspective by Les Hazlewood '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p><a href="http://www.sonatype.com/people/wp-content/uploads/2009/10/maven.png"><img src="http://www.sonatype.com/people/wp-content/uploads/2009/10/maven.png" alt="" title="maven" width="250" height="72" class="alignright size-full wp-image-3145" /></a></p>

<p><a href="http://www.leshazlewood.com">Les Hazlewood</a> has an objective summary of why he eventually came around to deciding that Maven is a better overall solution then Ant + Ivy. This is an evolution in thought process that we, <a href="http://www.sonatype.com">Sonatype</a>, often see in enterprises and Les has two blog entries that illustrate this evolution perfectly.</p>

<p><a href="http://www.leshazlewood.com/?p=44">Maven 2 vs Ant+Ivy: Our selection process</a>: This entry gives Les&#8217; original perspective on Maven and the process by which he originally decided to choose Ant + Ivy.</p>

<p><a href="http://www.leshazlewood.com/?p=55">Maven 2 vs Ant+Ivy: Revisited</a>: This entry gives Les&#8217; new perspective and why his enterprise team, and the Apache Shiro project, have chosen Maven.</p>

<blockquote>
  <p>I now firmly believe that Maven 2 is a better build and project management tool than Ant+Ivy. I was wrong.</p>
  
  <p>Yep, I said it. I’m man enough to admit when I’ve made mistakes and that I’ve learned from my experiences. And this is coming from the guy that wrote a (still popular) OnJava article for Ant in the enterprise.</p>
  
  <p>Overall, life with Maven is good. I’m glad that I was able to swallow my pride, really give it a chance, and in turn reap the benefits. I haven’t used Ant in over a year since switching, nor have I ever felt the need to go back.</p>
</blockquote>

<p>We hope this perspective helps potential enterprises save time when looking for a build and release infrastructure.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/01/maven-over-ant-ivy-a-team-perspective-by-les-hazlewood/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selecting OSS Software: 10 Questions Answered for Sonatype Nexus</title>
		<link>http://www.sonatype.com/people/2010/01/10-questions/</link>
		<comments>http://www.sonatype.com/people/2010/01/10-questions/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 17:00:42 +0000</pubDate>
		<dc:creator>Jason van Zyl</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[enterprise]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=3842</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/10-questions/' addthis:title='Selecting OSS Software: 10 Questions Answered for Sonatype Nexus '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Last month there was an article on TechRepublic entitled &#8220;10 questions to ask when selecting open source products for your enterprise&#8221;.   As both a consumer and producer of open source enteprise software, I thought that this list of questions captures the areas that people should be thinking about when they are selecting a technology. [...]]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.sonatype.com/people/2010/01/10-questions/' addthis:title='Selecting OSS Software: 10 Questions Answered for Sonatype Nexus '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p><!--reddZ=none--> <a href="http://www.sonatype.com/people/wp-content/uploads/2010/01/nexus-small.png"><img class="alignright size-full wp-image-3683" title="nexus-small" src="http://www.sonatype.com/people/wp-content/uploads/2010/01/nexus-small.png" alt="" width="250" height="62" /></a>Last month there was an article on TechRepublic entitled <a rel="nofollow" href="http://blogs.techrepublic.com.com/10things/?p=1232">&#8220;10 questions to ask when selecting open source products for your enterprise&#8221;</a>.   As both a consumer and producer of open source enteprise software, I thought that this list of questions captures the areas that people should be thinking about when they are selecting a technology.   Open source technology selection is about much more than just feature comparison.   When you are selecting an open source technology, you have to think about licensing issues, the scope of the supporting community, and open source governance models.   Since we&#8217;ve been talking a lot about Nexus, I wanted to summarize our efforts by answering these questions for potential users.  If you&#8217;re trying to decide what repository manager to use in your organization I hope that the answers to these questions help you make an informed decision.<span id="more-3842"></span></p>

<h3>1. Are the open source license terms compatible with my business requirements?</h3>

<p>There are many possible things to consider here but, I believe, the primary points to consider for an OSS application are:</p>

<ul>
    <li>Can I extend as necessary?  Is there anything about the license that is going to prevent me from extending the product or fixing a problem?</li>
    <li>Is there going to be someone around to support the product long-term?  Is the license going to provide a way for the organization backing the project to survive well into the future?</li>
</ul>

<p>We thought for a long while before selecting the GNU Public License (GPL) for Nexus and we made it clear right from the start <a rel="nofollow" href="http://nexus.sonatype.org/nexus-faq.html">why we chose the GPL</a>. We knew that we would invest heavily in Nexus.  Even though the people involved with Sonatype are traditionally users of Apache style licenses, we didn&#8217;t know how our business would evolve and we wanted to choose a license that would offer adequate protection for that investment. We were honest and upfront about it. We chose a more restrictive license first this allows us to adapt and use a less restrictive license in the future if we think it is appropriate for the community.</p>

<p>If you are considering software for an enterprise then you want there to be a supporting company, or companies, and the business model of the supporting company is important because you want them to be around for a while.   GPL gives us some way to protect our investment, and it allows our end-users to extend and customize an open product.</p>

<h3>2. What is the strength of the community?</h3>

<p>The people working at Sonatype are the key people in the Maven, Nexus, and m2eclipse projects.   Community work is an essential part of the everyday work of each of our developers.    While we focus on creating great software, many of the libraries and tools we use are produced within the Maven community &#8211; an ecosystem that encompasses several commercial participants, approximately 20 core developers, and millions of users.   Nexus Professional helps to maintain the Central Maven repository which is used by millions of developers world-wide.</p>

<p>One of the core goals of the Nexus project is to strengthen the technical infrastructure of the community it supports.    This technical symbiosis is evident in the work that Brian Fox, our VP of Engineering, has been doing to help <a rel="nofollow" href="http://www.sonatype.com/people/2010/01/managing-oss-forges-with-nexus/">manage important OSS repositories</a>. We are currently working with organizations and companies including Alfresco, Apache, Atlassian, Codehaus, ExoPlatform, Glassfish, Open QA, Scala-Tools, and JBoss to support the creation of quality artifact repositories that feed into the Central Maven repository.  This Central Maven repository is the central collaboration point for the entire world of Java developers.  In addition to working with the main feeder repositories, there is also an instance of Nexus available to any open source project that wishes to take advantage of the services available at <a rel="nofollow" href="http://oss.sonatype.org">http://oss.sonatype.org</a>. We already have a large number of projects using this service and it&#8217;s growing by the day.</p>

<p>Nexus is also at the center of an effort to unify disparate languages and technologies on a single repository platform.   Our recent efforts to support RubyGems, OBR, and P2 repositories are attempts to unify disparate communities into a single community supported by a platform which favors interoperability.</p>

<h3>3. How well is the product adopted by users?</h3>

<p>Going back to the previous answer, the adoption of Nexus is something that is evident in the number of OSS &#8220;forges&#8221; that have selected Nexus. At virtually every important OSS forge there is now an instance of Nexus running, and Nexus has been integrated into the software release process. Nexus is also used to help Maven Central as well which is the largest public artifact repository in the world. Nexus has rapidly become the de facto standard for artifact repository management.</p>

<p>Another data point that reflects adoption by users is the number of times a user will answer a support question on a public list.   On the Nexus IRC channel and Nexus user mailing list, we&#8217;ve noticed a trend over the past few months where non-Sonatype employees are starting to answer user questions about Nexus without any involvement from the Nexus development team.   This community involvement in the support process is a sign that Nexus users are not just installing the product and going away, they are starting to become productive and active members of the community that surrounds Nexus.</p>

<h3>4. Can I get a warranty or commercial support if I need it?</h3>

<p>Of course. Sonatype provides professional support for our commercial Nexus offering.   When you purchase Nexus Professional you get one year of support which includes commitments to turn-around time for solving critical issues.   Nexus Professional users are also given dedicated channels that they can use to communicate directly with the Nexus team.  Sonatype currently offers enterprise-level support to some of the largest companies in the world, and this support is built into the product.</p>

<p>For Nexus Open Source we are very responsive to users on our mailing list, and we are constantly available on an IRC channel to answer any questions from users who have any questions for us.</p>

<h3>5. What quality assurance processes exist?</h3>

<p>Sonatype is fanatical about quality.   We are so committed to quality that we&#8217;ll delay our software releases indefinitely if they don&#8217;t meet our strict quality assurance procedures.     We&#8217;d rather release nothing than release software before it is ready because we know how frustrating it is to use software that feels like it is half completed.   If you don&#8217;t take our word for it, take a look at our issue tracker&#8217;s <a rel="nofollow" href="https://issues.sonatype.org/secure/ReleaseNote.jspa?projectId=10001&amp;version=10503">release notes for the 1.4.0 release</a> to get a feel for the level of detail you can expect from us with a release.  Nexus has, without a doubt, the best QA process for any of the repository manager that exists. You only need to look at our unit tests, integration tests, and full manual regression test suite to get an idea of how stringent we are.</p>

<p>While our internal development process revolves around quality, sometimes the only way to really shake out the bugs is to run your product in a production environment.   Sonatype has the great benefit of running Nexus on the most active OSS forges in the world.    We run Nexus instances for open source projects that serve gigabytes of artifact data every day, and we often find problems with Nexus long before our users even had a chance to notice.     Our product also ships with automatic error detection and error submission mechanisms that will communicate problems to our support staff as they happen in the field.   We are proactive about finding problems before our users and customers.</p>

<h3>6. How good is the documentation?</h3>

<p>Sonatype views documentation as a key differentiator.    &#8220;Repository Management with Nexus&#8221; is a free book, available on the web, as a PDF download, or as a printed book from Lulu.com.   This 325-page book contains 19 chapters and five appendices that detail every facet of Nexus Open Source and Nexus Professional.    Complete with an introduction to the concepts and motivation behind repository managers, this book is a comprehensive reference.  The Nexus book is available from: <a rel="nofollow" href="http://www.sonatype.com/books/nexus-book/reference/">http://www.sonatype.com/books/nexus-book/reference/</a></p>

<h3>7. How easily can the system be customized to my exact requirements?</h3>

<p>Nexus follows the Open Core principle where we have a solid kernel that is extended by plug-ins. We have many OSS and commercial users who have extended Nexus and we are trying to make that even easier to do. Damian Bradicich, one of our core developers, wrote a blog recently about <a rel="nofollow" href="http://www.sonatype.com/people/2010/01/writing-a-nexus-plugin-using-m2eclipse/">our efforts to make developing Nexus plugins simple</a>.  We&#8217;re focusing on ways to make it even easier to start a Nexus plug-in project, and develop and debug these plugins inside Eclipse.</p>

<p>Nexus, as a platform, is about as extensible as it gets.   We&#8217;ve designed the system to be agnostic about the types of artifacts is manages, and you could extend it to manage, index, and distribute any kind of binary artifact.   It really wouldn&#8217;t even need to be limited to software.  We&#8217;ve considered developing some proof of concept demonstrations to show people how Nexus could be used to store, index, and distribute audio and video content using the extensible RDF metadata capabilities to store metadata and the customizable UI to present multimedia content.   The point isn&#8217;t that you would ever need to do this, it is to prove that Nexus could be customized to satisfy any requirements you could throw at it.</p>

<h3>8. How is this project governed and how easily can I influence the road map?</h3>

<p>The Sonatype development team includes a number of key participants in the Maven community.  We&#8217;re very familiar with the importance of open source governance models because we&#8217;re actively involved in one of the most active and open communities in open source.   Even though Nexus is a Sonatype project, we appreciate the need to adhere to the core values of other successful open source project.   First and foremost, the project is run as a meritocracy, good ideas trump status and hierarchy.   Second, we value transparency for the Nexus Open Source project, and we understand the need to adhere to a common set of policies and procedures to make it easier for external contributors to contribute and participate.</p>

<p>The Nexus project currently includes four external developers who have contributed enough to the project to merit commit rights to the source repository.   If you are motivated enough to volunteer and contribute your time to this open source project, we welcome your contribution.</p>

<h3>9. Will the product scale to my enterprise’s requirements?</h3>

<p>If you are talking about scalability in terms of number of users or projects using Nexus, there is no greater proof than the fact that Nexus is used to manage two of the largest feeder repositories for the Central Maven repository.    Nexus is used to manage the Apache release and snapshot repositories and the Codehaus repositories.   Both of these projects approximate the largest corporate environments in the world with thousands of developers distributed across the globe, enterprise LDAP servers, and a high volume of requests from clients requesting artifacts.</p>

<p>Nexus was designed, from the beginning, to meet the requirements of global-scale open source development.</p>

<h3>10. Are there regular security patches?</h3>

<p>Sonatype tends to make a point release of Nexus once every month.   We&#8217;re currently about to cut the 1.5 release of Nexus, and, with every release, we fix a number of bugs that have been uncovered by our testing procedures.    Because we run some of the highest profile repositories on the internet, we are constantly patching Nexus to meet security issues that most of our customers would never need to worry about.   We&#8217;ve dealt with distributed denial of service attacks and other security issues as part of maintaining the central maven repository.  Nexus is battle tested and secure.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/01/10-questions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

