<?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; Tim O&#8217;Brien</title>
	<atom:link href="http://www.sonatype.com/people/author/tim/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sonatype.com/people</link>
	<description>State-of-the-Art Build Production for the Modern Software Enterprise</description>
	<lastBuildDate>Mon, 30 Aug 2010 10:00:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>How to Migrate from Ant to Maven: Project Structure</title>
		<link>http://www.sonatype.com/people/2010/08/how-to-migrate-from-ant-to-maven-project-structure/</link>
		<comments>http://www.sonatype.com/people/2010/08/how-to-migrate-from-ant-to-maven-project-structure/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 06:00:26 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[ant]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=6119</guid>
		<description><![CDATA[
		
		
		
		I&#8217;ve seen my fair share of projects migrating from Ant to Maven, and, for a complex project, this migration path can take some time.  You have to worry about dependency management, project structure, and retraining an existing team to use Maven and understand the core concepts behind the tool.  When you make the [...]]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: left; width: 42px; padding-right: 10px; margin: 0 10px 0 0;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://www.sonatype.com/people/2010/08/how-to-migrate-from-ant-to-maven-project-structure/";
		var dzone_title = "How to Migrate from Ant to Maven: Project Structure";
		var dzone_style = "1";
		var dzone_blurb = "I&#8217;ve seen my fair share of projects migrating from Ant to Maven, and, for a complex project, this migration path can take some time.  You have to worry about dependency management, project structure, and retraining an existing team to use Maven...";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><p>I&#8217;ve seen my fair share of projects migrating from Ant to Maven, and, for a complex project, this migration path can take some time.  You have to worry about dependency management, project structure, and retraining an existing team to use Maven and understand the core concepts behind the tool.  When you make the shift, you are often affecting development infrastructure for an existing project, and you need to take into account development environments as well as developer&#8217;s ideas about how code should be organized and stored in source control.   In this post, I&#8217;m going to discuss a common pattern I&#8217;ve seen in Ant to Maven migrations: how to migrate the monolithic project.</p>

<p><span id="more-6119"></span></p>

<h3>A Common Pattern: The Monolithic Project</h3>

<p>Ant projects which have evolved over many years often lack modular structure.   While it is certainly possible to create the equivalent of a multi-module Maven project in Ant, the usual progression in an Ant project is to store all of your source in a single tree and use extra targets to selectively compile different packages.   This approach is shown in the following figure.</p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/ant-migrate-structure.png"><img src="http://www.sonatype.com/people/wp-content/uploads/2010/08/ant-migrate-structure.png" alt="" title="ant-migrate-structure" width="445" height="348" class="aligncenter size-full wp-image-6120" /></a></p>

<p>In the most extreme cases, there is a single project which contains an array of modules.   Maybe you have an entire enterprise system all stored in a single project alongside a complex Ant build.xml file which contains a collection of tasks for each component.   A monolithic Ant project usually produces a series of artifacts: a JAR containing some API for clients, a server-side web application, a utility library, etc.   Developers have usually grown so accustomed to this approach that the idea of splitting up a complex system into a series of related submodules can see daunting.</p>

<h3>Moving to Maven: Do we need all these projects?</h3>

<p>One of the first questions I get in a Maven migration from Ant is whether it is really necessary to modularize a project.  &#8220;Do we really need to create all these projects for Maven?&#8221;    (Short answer: Yes, there is no avoiding this.)   This is usually accompanied by a concern that Maven limits each project to producing a single artifact.   These are two core assumptions of Maven: your projects will be modularized and each project should produce a single build artifact.</p>

<p>Now, while these are core assumptions, there are ways around them, and I&#8217;ve even seen people go to extreme lengths in an attempt to preserve this single, monolithic project.   You can create an elaborate set of profiles to modify the build depending on the context in which it is run, and you can attach extra build artifacts to a project using assemblies.   Even though Maven makes assumptions about code layout and project structure, it can do just about anything, and in this case, it can be used to approximate the monolithic, combined Ant project.</p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/ant-migrate-structure-misguided.png"><img src="http://www.sonatype.com/people/wp-content/uploads/2010/08/ant-migrate-structure-misguided.png" alt="" title="ant-migrate-structure-misguided" width="508" height="482" class="aligncenter size-full wp-image-6122" /></a></p>

<p>If you do this, if you try to trick Maven the first thing you&#8217;ll notice is that your monolithic project&#8217;s POM is going to be somewhat unwieldy: it is going to be massive.   Instead of a simple, declarative picture of a project, you are going to have a POM that contains multiple assembly definitions.  Each assembly definition is going to have to explicitly define the structure of your build artifacts and you are going to find yourself venturing into includes and excludes patterns for things like the Maven Compiler plugin.  In other words, you are going to have to expend a huge amount of effort to bend Maven to your assumptions.</p>

<p>If you do this, you really won&#8217;t be using &#8220;Maven&#8221;.  You&#8217;ll be using your own interpretation of Maven, and once you go down this road, you are going to start having problems using standard tools designed for Maven.   In short, don&#8217;t do this.  Don&#8217;t try to bypass Maven&#8217;s approach to modularity with assemblies and profiles.  If you do, you are going to find yourself &#8220;swimming upstream&#8221;, and your first hint is going to be the size and complexity of your POM files.     I&#8217;ve certainly created some complex POMs in my time, but I only need to do this for projects that really require customization because they are doing something unique (see the POMs for the Maven book builds, they are large and extremely customized).</p>

<p>If you are creating web applications, EARs, and simple Java applications you shouldn&#8217;t have large POMs.   If you do, it is probably a sign that you have ventured too far &#8220;off the map&#8221;.   While you might be building your project with &#8220;Maven&#8221;, there is likely something wrong with your approach.   If you find yourself constantly challenging an assumption as basic as project modularity, then you need to either rethink using Maven entirely or rethink your project structure.</p>

<h3>Adopting Maven Means Adopting Modular Structure</h3>

<p>If you are going to adopt Maven, you must adopt a modular project structure.  If you don&#8217;t you will be fighting an uphill battle with Maven and the tools that have been designed to work with it.   You will be fighting not only with Maven, but you&#8217;ll be doing constant battle with your IDE and your repository manager.</p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/ant-migrate-structure-maven.png"><img src="http://www.sonatype.com/people/wp-content/uploads/2010/08/ant-migrate-structure-maven.png" alt="" title="ant-migrate-structure-maven" width="512" height="548" class="aligncenter size-full wp-image-6123" /></a></p>

<p>If you are moving from Ant to Maven, do you yourself a favor.   Adopt a modular project structure.  Don&#8217;t approach Maven as a &#8220;toolbox&#8221; like Ant with tasks and targets.   Approach Maven as a framework with expectations and assumptions.  If you do this, you&#8217;ll have a much easier time adopting the tool.</p>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/08/how-to-migrate-from-ant-to-maven-project-structure/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to Migrate Repositories from Artifactory to Nexus</title>
		<link>http://www.sonatype.com/people/2010/08/how-to-migrate-repositories-from-artifactory-to-nexus/</link>
		<comments>http://www.sonatype.com/people/2010/08/how-to-migrate-repositories-from-artifactory-to-nexus/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 06:00:21 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Nexus]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[artifactory]]></category>
		<category><![CDATA[migration]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=6095</guid>
		<description><![CDATA[
		
		
		
		Sonatype is pleased to announce version 1.5 of the Nexus Migration Plugin.   This version contains an updated implementation of our Artifactory to Nexus migration tool.   If you are currently running Artifactory and you want to migrate to Nexus, all you need to do is:


   Create a System Export from [...]]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: left; width: 42px; padding-right: 10px; margin: 0 10px 0 0;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://www.sonatype.com/people/2010/08/how-to-migrate-repositories-from-artifactory-to-nexus/";
		var dzone_title = "How to Migrate Repositories from Artifactory to Nexus";
		var dzone_style = "1";
		var dzone_blurb = "Sonatype is pleased to announce version 1.5 of the Nexus Migration Plugin.   This version contains an updated implementation of our Artifactory to Nexus migration tool.   If you are currently running Artifactory and you want to migrate to Nexus, all you...";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><p>Sonatype is pleased to announce version 1.5 of the Nexus Migration Plugin.   This version contains an updated implementation of our Artifactory to Nexus migration tool.   If you are currently running Artifactory and you want to migrate to Nexus, all you need to do is:</p>

<ol>
   <li>Create a System Export from Artifactory</li>
   <li>Install Nexus with the Nexus Migration Plugin</li>
   <li>Import Your Artifactory System Export to Nexus</li>
   <li>Configure the Artifactory Bridge to seamlessly serve artifacts to existing clients</li>
</ol>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/migrate-artifactory2.png"><img src="http://www.sonatype.com/people/wp-content/uploads/2010/08/migrate-artifactory2.png" alt="" title="migrate-artifactory" width="490" height="649" class="aligncenter size-full wp-image-6103" /></a></p>

<p>You can use the Nexus Migration Plugin with Nexus Open Source or Nexus Professional.   To get started, download <a href="http://nexus.sonatype.org/downloads/">Nexus Open Source</a> or <a href="http://www.sonatype.com/products/nexus">Nexus Professional</a>, then download the <a href="http://nexus.sonatype.org/downloads/">Nexus Migration Plugin</a>.   Read <a href="http://www.sonatype.com/books/nexus-book/reference/artifactory.html">Appendix A</a> of the Nexus Book and learn how to:</p>

<ul>
  <li><a href="http://www.sonatype.com/books/nexus-book/reference/artifactory-sect-installation.html">Install the Nexus Migration Plugin</a></li>
  <li><a href="http://www.sonatype.com/books/nexus-book/reference/artifactory-sect-create-backup.html">Create a System Export in Artifactory</a></li>
  <li><a href="http://www.sonatype.com/books/nexus-book/reference/artifactory-sect-importing.html">Import an Artifactory System Backup into Nexus</a></li>
  <li><a href="http://www.sonatype.com/books/nexus-book/reference/artifactory-sect-configuring.html">Configure Repository Mapping and Import Settings</a></li>
  <li><a href="http://www.sonatype.com/books/nexus-book/reference/artifactory-sect-bridge.html">Map Legacy Artifactory URLs to Nexus</a></li>
</ul>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/08/how-to-migrate-repositories-from-artifactory-to-nexus/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#8220;Maven: The Complete Reference&#8221; Now Available as an epub</title>
		<link>http://www.sonatype.com/people/2010/08/maven-the-complete-reference-now-available-as-an-epub/</link>
		<comments>http://www.sonatype.com/people/2010/08/maven-the-complete-reference-now-available-as-an-epub/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 20:08:56 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Book]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Sonatype]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=6058</guid>
		<description><![CDATA[
		
		
		
		Sonatype is pleased to announce the availability of our most popular book, Maven: The Complete Reference, as an epub.  Click here to download the book as an epub and start reading this book on a mobile device. 

If you have any questions or feedback, we encourage you to send email to book@sonatype.com.   [...]]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: left; width: 42px; padding-right: 10px; margin: 0 10px 0 0;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://www.sonatype.com/people/2010/08/maven-the-complete-reference-now-available-as-an-epub/";
		var dzone_title = "&#8220;Maven: The Complete Reference&#8221; Now Available as an epub";
		var dzone_style = "1";
		var dzone_blurb = "Sonatype is pleased to announce the availability of our most popular book, Maven: The Complete Reference, as an epub.  Click here to download the book as an epub and start reading this book on a mobile device. If you have any questions or feedback, we...";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><p>Sonatype is pleased to announce the availability of our most popular book, Maven: The Complete Reference, as an epub.  Click <a href="http://www.sonatype.com/maven/documentation/download-reference?file=books/maven-complete-reference.epub">here</a> to <a href="http://www.sonatype.com/maven/documentation/download-reference?file=books/maven-complete-reference.epub">download the book as an epub</a> and start reading this book on a mobile device. </p>

<p>If you have any questions or feedback, we encourage you to send email to <a href="mailto:book@sonatype.com">book@sonatype.com</a>.   If you have any problems to report, please include the section number and the type of mobile device you are reading this book on.   This book has been tested on iPad, iPhone, Sony Reader library and the Adobe Digital Edition reader.</p>

<p>If you are new to Maven, don&#8217;t forget to check out <a href="http://nexus.sonatype.org">Nexus Open Source</a> and <a href="http://www.sonatype.com/products/nexus">Nexus Professional</a>.  If you develop with Maven, you should be using Nexus.   Once you start using a Repository Manager, you won&#8217;t believe you ever developed without one.</p>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/08/maven-the-complete-reference-now-available-as-an-epub/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Maven by Example now available as an ePub</title>
		<link>http://www.sonatype.com/people/2010/08/maven-by-example-now-available-as-an-epub/</link>
		<comments>http://www.sonatype.com/people/2010/08/maven-by-example-now-available-as-an-epub/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 22:32:42 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[Book]]></category>
		<category><![CDATA[epub]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=6042</guid>
		<description><![CDATA[
		
		
		
		We&#8217;ve received a steady stream of requests to release &#8220;Maven by Example&#8221; and &#8220;Maven: The Complete Reference&#8221; in the ePub format.   Today, we&#8217;re announcing the availability of Maven by Example as an ePub.   Download the Maven by Example ePub today and start learning about Maven.

This release has been tested on Apple&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: left; width: 42px; padding-right: 10px; margin: 0 10px 0 0;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://www.sonatype.com/people/2010/08/maven-by-example-now-available-as-an-epub/";
		var dzone_title = "Maven by Example now available as an ePub";
		var dzone_style = "1";
		var dzone_blurb = "We&#8217;ve received a steady stream of requests to release &#8220;Maven by Example&#8221; and &#8220;Maven: The Complete Reference&#8221; in the ePub format.   Today, we&#8217;re announcing the availability of Maven by Example as an ePub.   Download...";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><p>We&#8217;ve received a steady stream of requests to release &#8220;Maven by Example&#8221; and &#8220;Maven: The Complete Reference&#8221; in the ePub format.   Today, we&#8217;re announcing the availability of Maven by Example as an ePub.   <a href="http://www.sonatype.com/maven/documentation/download-example?file=books/maven-by-example.epub">Download the Maven by Example ePub</a> today and start learning about Maven.</p>

<p>This release has been tested on Apple&#8217;s iBook on both an iPad and iPhone and in the Adobe Digital Editions reader.   To read this book on an iPad or iPhone: install the latest version of iTunes, download the ePub from Sonatype, and import the file using &#8220;Add to Library&#8230;&#8221; from the File menu.</p>

<p>We would appreciate any feedback you might have about formatting and layout.   If you have questions, comments, or problem reports about our ePub books, send an email to <a href="mailto:book@sonatype.com">book@sonatype.com</a>.  If you are reporting a typo or a problem with our ePub books, please make sure to include the device and software you are using as well as the section number, as page counts can vary depending on text size and device layout.</p>

<p>Stay tuned for &#8220;Maven: The Complete Reference&#8221; in an ePub format.</p>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/08/maven-by-example-now-available-as-an-epub/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benefits of a Repository Manager: Part V External Partners and Vendors</title>
		<link>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-v-external-partners-and-vendors/</link>
		<comments>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-v-external-partners-and-vendors/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 12:00:06 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[Maven Central]]></category>
		<category><![CDATA[repository manager]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=5931</guid>
		<description><![CDATA[
		
		
		
		In the previous posts in this series, we&#8217;ve talked about how a repository manger changes the development cycle.   In this post, I&#8217;m going to talk about how a repository manager can be used as a way to interact with third parties.   Specifically, I&#8217;m going to talk about vendors and partners.




While Maven [...]]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: left; width: 42px; padding-right: 10px; margin: 0 10px 0 0;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-v-external-partners-and-vendors/";
		var dzone_title = "Benefits of a Repository Manager: Part V External Partners and Vendors";
		var dzone_style = "1";
		var dzone_blurb = "In the previous posts in this series, we&#8217;ve talked about how a repository manger changes the development cycle.   In this post, I&#8217;m going to talk about how a repository manager can be used as a way to interact with third parties.   Specifically,...";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><p>In the previous posts in this series, we&#8217;ve talked about how a repository manger changes the development cycle.   In this post, I&#8217;m going to talk about how a repository manager can be used as a way to interact with third parties.   Specifically, I&#8217;m going to talk about vendors and partners.</p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/vendor-partner.png"><img class="aligncenter size-full wp-image-5933" title="vendor-partner" src="http://www.sonatype.com/people/wp-content/uploads/2010/08/vendor-partner.png" alt="" width="479" height="191" /></a>
<span id="more-5931"></span></p>

<p>While Maven Central contains a huge number of libraries, there are still some pretty important things missing.    Anything covered by a non-open-source license, like the Oracle JDBC drivers or anything proprietary, isn&#8217;t going to be made available from the Maven Central repository.    Very often there are going to be commercial libraries that you will need to download and install in a third party repository.    While this works, it requires some manual work to upload the artifact.</p>

<h2>Vendors and Repository Management</h2>

<p>When your vendors embrace repository management, there&#8217;s no reason why you would have to manually install any third party JARs in your corporate repository.   Instead, vendors who need to provide binaries to customers would provide them via authenticated public repositories.   These vendor-run repositories, protected by authentication credentials, would allow customers to synchronize local, corporate repository managers with commercial software vendors.  This would allow vendors to capitalize on a new, &#8220;always connected&#8221; model for software delivery.</p>

<p>Now, the situation for the customer is simple.  Once they set up an authenticated proxy repository to connect to a vendor&#8217;s repository, the vendor can deliver new updates and software directly to a customer&#8217;s repository.</p>

<p>The situation for the vendor is equally straightforward.  Instead of having to send the customer a packaged set of binaries, they simply tell the customer to update a version number in a dependency.    The build will then interrogate the customer&#8217;s repository and then automatically download the repository from the vendor.</p>

<p>Both the customer and the vendor have fewer moving parts to worry about, and the task of delivering software becomes very simple.</p>

<p>The vendor receives another benefit from this setup.   They are now able to keep track of which customers had requested which artifacts.   The vendor can control which artifacts or features of a product suite a customer has access to, and they could use the repository manager as a way to enforce licensing or provide metered, on-demand access to software components.</p>

<h2>Partners and Repository Management</h2>

<p>In today&#8217;s increasingly connected world, it is very common for one company to provide an API for partners.   Sites like Twitter and Google provide APIs for the general public, and other companies provide partner-specific APIs for collaboration.    If you provide an API for a partner company, you can expose libraries and interfaces using a public-facing, authenticated repository.</p>

<p>Suppose that you work at a financial institution that needs to partner with another financial institution.    The two institutions have agreed to collaborate with one another using a simple set of REST services.   While these REST services are very well documented, you also want to make sure that your partner is invoking these REST services according to a set of standards.   To make it easier to consume these services, you&#8217;ve created a simple client library for your partner.</p>

<p>To make it even easier for your partners to use this library, you&#8217;ve published versions of this library to a public-facing, authenticated repository.   Using the security features of a modern repository manager, you can create partner-specific library versions and limit access to just the intended recipients.  You can also maintain detailed audits of when a particular API was delivered to a particular partner.</p>

<p>As more and more organizations start to adopt the best practice of running a repository manager, these same organizations will be creating ad-hoc, private relationships to emulate the ease of Maven Central for a corporate environment.  Partners, vendors, and consortia of companies will create repositories to facilitate code sharing and cooperation.</p>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-v-external-partners-and-vendors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benefits of a Repository Manager: Part IV Deployment</title>
		<link>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-iv-deployment/</link>
		<comments>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-iv-deployment/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 12:00:08 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[repository manager]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=5926</guid>
		<description><![CDATA[
		
		
		
		In the last post of this series we talked about how a repository manager, when coupled with a continuous integration server, allows you to work on individual modules in complex multi-module projects.  In the post before that, we talked about the repository as something that enables greater collaboration between workgroups.   In this [...]]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: left; width: 42px; padding-right: 10px; margin: 0 10px 0 0;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-iv-deployment/";
		var dzone_title = "Benefits of a Repository Manager: Part IV Deployment";
		var dzone_style = "1";
		var dzone_blurb = "In the last post of this series we talked about how a repository manager, when coupled with a continuous integration server, allows you to work on individual modules in complex multi-module projects.  In the post before that, we talked about the repository...";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><p>In the last post of this series we talked about how a repository manager, when coupled with a continuous integration server, allows you to work on individual modules in complex multi-module projects.  In the post before that, we talked about the repository as something that enables greater collaboration between workgroups.   In this post, I explore how using a repository manager simplifies deployment.</p>

<p>The following diagram shows the process of pushing code to production and automating a deployment:</p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/deploy-scripts.png"><img class="aligncenter size-full wp-image-5927" title="deploy-scripts" src="http://www.sonatype.com/people/wp-content/uploads/2010/08/deploy-scripts.png" alt="" width="337" height="261" /></a>
<span id="more-5926"></span></p>

<p>This post will first discuss production deployments by setting up a hypothetical example.    Assume that your organization runs a fairly complex application that consists of a few back office systems, a CRM system, and a web application.   When your company needs to deploy one of these systems to production, the result is a highly orchestrated symphony of activity.    Servers need to be taken offline in a coordinated manner across a distributed network of machines.   Downtime needs to be planned and communicated to the right individuals, and backups need to be created before any new code is pushed to a production system.</p>

<p>In other words, any time you need to push new code to production, it is a real challenge to make sure that everyone is coordinating in just the right way.    A few days before a production deployment, the development team freezes a particular branch and tags a release.  This release is then installed in a QA environment.   The QA team tests the release candidate, and if all goes well, this release is then deployed to production.</p>

<p>Without a repository manager, your operations teams has to know how to checkout a release tag from SCM, they have to run the entire build to generate a few binary artifacts, and then they need to write some scripts to automate a deployment to production.</p>

<p>With a repository manager, you can publish a release candidate binary to a hosted repository.   This release candidate binary can then be used by a series of deployment scripts (or a tool like ControlTier or Puppet).    You can have a deployment script that will publish the deployment to a QA environment, and then you can have a deployment script that takes the same, certified binary and publishes it to production.</p>

<p>The main difference between these two approaches is that the second approach adds some isolation between the SCM system and the deployment script.  If your production deployment depends directly on your build, you have to recompile and repackage your entire system every time you do a deployment.    This is often a challenge because the people that run the build system for deployment are seldom the same engineers that develop your system.   If your operations team has to check out source code from an SCM just to build a production network, you are introducing some risk into your process.</p>

<p>Instead, use the repository manager as a way to share binaries with operations.  If you are deploying applications to QA and production, having to rebuild an entire system from SCM just to deploy a system to an environment is an unnecessary risk.   Instead of certifying tags in an SCM, your QA testers should be certifying binaries.    This way you can be certain that the systems you are deploying to production have been tested.</p>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-iv-deployment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benefits of a Repository Manager: Part III Continuous Build Deployment</title>
		<link>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-iii-continuous-build-deployment/</link>
		<comments>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-iii-continuous-build-deployment/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 13:46:30 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[builds]]></category>
		<category><![CDATA[continuous]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[repository]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=5914</guid>
		<description><![CDATA[
		
		
		
		In the previous post in this series I discussed three compelling ways in which a repository manager can benefit the development cycle.   It proxies artifacts locally, it is optimized to store binary artifacts, and it facilitates a new level of collaboration and agility that isn&#8217;t possible when your SCM is only way for [...]]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: left; width: 42px; padding-right: 10px; margin: 0 10px 0 0;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-iii-continuous-build-deployment/";
		var dzone_title = "Benefits of a Repository Manager: Part III Continuous Build Deployment";
		var dzone_style = "1";
		var dzone_blurb = "In the previous post in this series I discussed three compelling ways in which a repository manager can benefit the development cycle.   It proxies artifacts locally, it is optimized to store binary artifacts, and it facilitates a new level of collaboration...";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><p>In the previous post in this series I discussed three compelling ways in which a repository manager can benefit the development cycle.   It proxies artifacts locally, it is optimized to store binary artifacts, and it facilitates a new level of collaboration and agility that isn&#8217;t possible when your SCM is only way for workgroups to collaborate.   In this post, I&#8217;m going to talk about how a repository manager works in concert with a continuous integration server like Hudson or Bamboo.</p>

<p><span id="more-5914"></span></p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/ci-builds.png"><img class="aligncenter size-full wp-image-5915" title="ci-builds" src="http://www.sonatype.com/people/wp-content/uploads/2010/08/ci-builds.png" alt="" width="337" height="147" /></a></p>

<p>First, the how, what, and when of a continuous integration server.  Continuous integration (CI) servers are an established fact of of modern development infrastructure.   It is a server which, for the most part, waits and watches.   It keeps a vigilant eye on your source control system and jumps into action every time it sees a code change.    When code changes, your CI system is usually configured to run the entire build, execute all of your unit and integration tests, and send out an email to every developer if it identifies a defect or a failed test.</p>

<p>It does this so that you will have an easier time identifying where a particular problem was introduced to the source code.   If John checks in some bad code, the CI system runs the build immediately, and about 30 minutes later, everyone in the group receives an email with the subject header &#8220;John just broke the build&#8221;.   It is a great way to identify errors, and it is also a great way to motivate developers to test locally before committing to a source control system as no one likes to be the reason for a build failure email.</p>

<p>Running a CI server is more than &#8220;just a good idea&#8221;.  Once your system reaches a certain level of complexity you can&#8217;t scale a system without commiting to continuous integration and testing.   If you don&#8217;t have continuous integration, you end up having to put all development on hold each time you want to perform a release.   If you don&#8217;t build, test, and deploy your system on a regular basis &#8211; if it isn&#8217;t something that is well rehearsed, integration becomes a time consuming nightmare of manual testing and builds that often leads to inconsistent builds.   This is especially true if your development effort spans multiple systems and multiple development workgroups.   You run a CI system because building, testing, and deploying your system should be automatic: it should be as trivial as pressing a button.</p>

<p>The concept of a CI server is only slightly more established than a repository manager, and very often you will see that an organization has identified the need for a CI server before they&#8217;ve identified the need for a repository manager.   If you are coding a complex system, there is a very good chance that you are already running a CI server.  The most popular servers out there are Hudson, Bamboo, and CruiseControl.   While the connection between CI servers and repository managers might not be immediately obvious, when used together they can introduce some new possibilities for the way you develop your systems.</p>

<h2>Continuous Publishing</h2>

<p>When you have a system to continuously build your code, you also have a system that can continuously publish SNAPSHOT artifacts to a repository manager to enable a more granular approach to development.   What do I mean by &#8220;a more granular approach to development&#8221;?  To answer that question, let&#8217;s take a look at a complex multi-module project using the example of the eCommerce group from the previous post in this series.</p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/ecom-multimod.png"><img class="aligncenter size-full wp-image-5918" title="ecom-multimod" src="http://www.sonatype.com/people/wp-content/uploads/2010/08/ecom-multimod.png" alt="" width="434" height="569" /></a></p>

<p>Assume you have a new programmer starting tomorrow.   Instead of throwing him at the entire forty-thousand lines of code, you would like to be able to give that developer a small, easy to digest task.    You want this developer to add support for PayPal&#8217;s Adaptive Payments API in your eCommerce system.  That&#8217;s it.   You don&#8217;t want them to be distracted by the overwhelming scope of the project, and you certainly can&#8217;t afford for them to take a three month voyage through your project&#8217;s code before they start contributing to the effort.   Deadlines are tight, and you don&#8217;t have enough people on your team.   It is important that new hires start programming as soon as they walk in the door.</p>

<p>Without a repository manager hooked up to a continuous integration server, if you try to checkout just the ecom-paypal project, the build is going to fail because it will try to download dependencies from a repository manager.   In the case of the ecom-paypal project, assume that the dependency graph looks like this.</p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/ecom-multimod-dep.png"><img class="aligncenter size-full wp-image-5919" title="ecom-multimod-dep" src="http://www.sonatype.com/people/wp-content/uploads/2010/08/ecom-multimod-dep.png" alt="" width="448" height="191" /></a></p>

<p>When you have a repository manager and a continuous integration server, you can configure your continuous integration server to publish SNAPSHOT artifacts (in-progress SNAPSHOT binaries) to your repository manager.   This will allow you to just check out a single, isolated portion of a much larger multi-module project.</p>

<p>Without a repository manager, trying to build version 1.3-SNAPSHOT of ecom-paypal in isolation is going to generate errors because you are forced to checkout the entire codebase to build and install all of the dependencies in your local repository.   With a repository manager, SNAPSHOT artifacts are being continuously published because Hudson is checking you SCM every few minutes and building the latest code.   When you run the ecom-paypal module&#8217;s build in isolation, Maven is going to download the most recent SNAPSHOT.</p>

<p>Without a repository manager, your new developer is going to have to download the entire codebase and run a large time-consuming build.   With a repository manager you can work on specific components of a larger multi-module project.    This ability to divide and conquer your codebase comes in very handy when you need a consultant to take a look at a specific problem, or when you need to look at a coding problem in isolation.</p>

<p>When you continuously publish build artifacts to a repository manager, you move away from the single monolithic project build and toward a project layout and architecture that lends itself to modularization.</p>

<p>In tomorrow&#8217;s post: How a Repository Manager decouples deployments from source code, and what that means for developer operations.</p>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-iii-continuous-build-deployment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benefits of a Repository Manager: Part II &#8211; Caching and Collaborating</title>
		<link>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-ii-caching-and-collaborating/</link>
		<comments>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-ii-caching-and-collaborating/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 12:00:25 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[Maven Central]]></category>
		<category><![CDATA[repository manager]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=5906</guid>
		<description><![CDATA[
		
		
		
		In the first part of this series, I gave you a glimpse at the big picture of repository management, and I listed some common anti-patterns present in systems that haven&#8217;t yet installed a repository manager.   In this post, I&#8217;m going to focused on the benefits a repository manager has on the development cycle. [...]]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: left; width: 42px; padding-right: 10px; margin: 0 10px 0 0;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-ii-caching-and-collaborating/";
		var dzone_title = "Benefits of a Repository Manager: Part II &#8211; Caching and Collaborating";
		var dzone_style = "1";
		var dzone_blurb = "In the first part of this series, I gave you a glimpse at the big picture of repository management, and I listed some common anti-patterns present in systems that haven&#8217;t yet installed a repository manager.   In this post, I&#8217;m going to focused...";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><p>In the first part of this series, I gave you a glimpse at the big picture of repository management, and I listed some common anti-patterns present in systems that haven&#8217;t yet installed a repository manager.   In this post, I&#8217;m going to focused on the benefits a repository manager has on the development cycle.   How does using a repository manager change the way your developers will approach development?   What problems does it solve? And what possibilities does it introduce?</p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/dev-proxy.png"><img class="aligncenter size-full wp-image-5907" title="dev-proxy" src="http://www.sonatype.com/people/wp-content/uploads/2010/08/dev-proxy.png" alt="" width="455" height="190" /></a>
<span id="more-5906"></span></p>

<h2>Caching artifacts locally</h2>

<p>The first, and most obvious, benefit is that a repository manager will proxy and cache artifacts from a remote repository.    If you use Maven or another tool that can download artifacts from Maven Central, you have probably had the experience of checking out a large build from source control and running it, only to have to wait for minutes while the build downloads dependencies from Maven Central.  An even bigger frustration than that, if your connection to the internet is tenuous, or if Central happens to be unavailable for whatever reason, you cannot build your code.</p>

<p>With a repository manager, downloading your dependencies takes much less time and your builds don&#8217;t rely on internet access.   Unless this is the first time building a particular project, all of the artifacts your build uses are going to be cached at the repository manager.   Instead of waiting for artifacts to be downloaded over the public internet, your build will download artifacts from a local server.   Since you avoid the public internet, this process is sped up significantly.   The build that once took 15 minutes to download dependencies will now take less than a minute to download everything it needs.</p>

<h2>Get those JARs out of Subversion</h2>

<p>The Oracle JDBC driver, a proprietary JAR from a vendor, is the kind of one-off, third party library that is not going to made available on a public repository.    Without a repository, the most obvious solution is to just check these JARs into source control and store them right next to your code.   When you run your build, branch your project, and release your code you are just passing around these binaries as a part of your project.   While this approach does work, you are overloading the source control system to perform a task it wasn&#8217;t designed for.</p>

<p>While Subversion, and many other modern SCM tools, will gladly version binaries, you are storing a static, unchanging artifact in source control.    Every time you checkout out source control, you are checking out binaries, and if you are unlucky enough to work somewhere that stores all libraries in source control, you will often be asked to check out a large repository of JARs.   Your SCM is going to carefully keep track of changes and version files that will never change.</p>

<p>This is both inefficient and unnecessary.  If you use a repository manager, you can upload third party libraries to a third party repository that stores artifacts on the repository manager.    Then you can mix these third party libraries into a public repository group that will combine the contents of public repositories with your own repositories.   In other words, you can declare a dependency on a custom, manually uploaded third party JAR as easily as you would declare a dependency on a library stored in Maven Central.    Don&#8217;t store binaries in source control, use a repository manager instead.</p>

<h2>Collaboration</h2>

<p>Collaboration is best illustrated with a hypothetical organization.   Imagine you work at an organization with three large development groups of about 30 developers.    There is an eCommerce group, which is responsible for writing systems that interact with banks and service providers like PayPal.   There is a CRM group, which has the unenviable job of merging two disparate CRM solutions from Peoplesoft and Oracle and wrapping those systems in an easy to use Java API.     Then there is a third group, the web applications group, which has the primary responsibility for wrapping these two back office systems in a slick web interface.   These relationships are captured in the following diagram:</p>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/three-groups.png"><img class="aligncenter size-full wp-image-5911" title="three-groups" src="http://www.sonatype.com/people/wp-content/uploads/2010/08/three-groups.png" alt="" width="394" height="388" /></a></p>

<p>Imagine that the eCommerce group and the CRM group have to assemble the entire external API into a single project:  ecommerce-api and crm-api.    These APIs contain all of the logic required to connect to a set of internal services hosted by each group.   As the eCommerce group and CRM groups innovate and offer new services, they will cut releases of these new APIs and publish those releases to the repository manager.</p>

<p>When the web applications group is ready to start using a new version of the eCommerce or CRM API they can simply define a dependency on a version of this artifact.    The build for the web applications group will then download the appropriate version of the eCommerce of CRM API from the corporate repository manager.</p>

<p>In this way, the repository manager is a central collaboration point for difference groups within the same company.    Without the use a repository manager, you will often see disparate groups forced to check each others code out of SCM and build it from scratch just to generate client libraries.   In the organization that has embraced repository management, these libraries are published as binaries for clients (in this case other workgroups) to consume from the repository manager.</p>

<p>When you collaborate using the SCM, it is very difficult to scale.   Every workgroup is forced to use the same set of tools for build management and you will very often see the entire IT operation having to synchronize releases.   When you share build artifacts using the repository manager, you decouple workgroups from one another and allow your internal teams to collaborate using a more adaptive, open-source model.</p>

<p>If the eCommerce group needs to innovate, they can do so without affecting the source code of the web applications group.   They can publish new releases to the repository manager, and the web applications group can decide when and how they are going to consume these releases by changing the version of a dependency in a build.</p>

<p>When you collaborate using the SCM, all of your workgroups are joined at the hip by a common codebase.   When you use a repository manager you allow different workgroups to innovate and create at their own pace.</p>

<p><em>In next week&#8217;s posts: Continuous Deployment and Integration</em></p>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-ii-caching-and-collaborating/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benefits of a Repository Manager: Part I</title>
		<link>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-i/</link>
		<comments>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-i/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 13:00:24 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[repository manager]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=5897</guid>
		<description><![CDATA[
		
		
		
		Whenever I speak to someone doing Java development, I always ask if they are using a repository manager. Repository managers are still an emerging technology, but I&#8217;ve noticed a consistent trend: more and more developers view a repository manager as an essential part of development infrastructure. This certainly wasn&#8217;t the case just two years ago, [...]]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: left; width: 42px; padding-right: 10px; margin: 0 10px 0 0;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-i/";
		var dzone_title = "Benefits of a Repository Manager: Part I";
		var dzone_style = "1";
		var dzone_blurb = "Whenever I speak to someone doing Java development, I always ask if they are using a repository manager. Repository managers are still an emerging technology, but I&#8217;ve noticed a consistent trend: more and more developers view a repository manager...";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><p>Whenever I speak to someone doing Java development, I always ask if they are using a repository manager. Repository managers are still an emerging technology, but I&#8217;ve noticed a consistent trend: more and more developers view a repository manager as an essential part of development infrastructure. This certainly wasn&#8217;t the case just two years ago, and I think that the big motivator behind this trend is that the quality and stability of Maven Central has improved remarkably because of the efforts of people like Brian Fox and others who are focused on making the service more stable.</p>

<p>Another reason why we&#8217;ve seen more adoption is that most developers understand the benefits of using a tool like Maven for automatic dependency management. In 2005, it was common to see projects store binary JARs alongside source code in projects. In 2010, you rely on the repository and the metadata it contains. If you use a library like Guice, you&#8217;ll add a dependency on the artifact and let your build tool take care of the details. To do otherwise would be to commit yourself to a manual work updating JARs and testing dependencies each time a new version of an external library is released.</p>

<p>Despite the increasing prevalence of repository managers, I still stumble upon workgroups and organizations that haven&#8217;t heard of repository management. When you ask if they are using a repository manager, they might think you are referring to Subversion or source control. This series of posts is a high-level overview of the main benefits of repository management. If you are trying to convince someone to start using a repository manager, the next few blog posts are for you.
<span id="more-5897"></span></p>

<h2>Repository Management: The Big Picture</h2>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/full-picture.png"><img class="aligncenter size-full wp-image-5898" title="full-picture" src="http://www.sonatype.com/people/wp-content/uploads/2010/08/full-picture.png" alt="" width="488" height="272" /></a></p>

<p>Compare the diagram shown above with the diagram shown below. In the next few posts, I am going to emphasize the specific benefits of using a repository manager. Specifically, I&#8217;m going to talk about:</p>

<ul>
    <li>How a repository manager changes the development cycle</li>
    <li>How continuous integration is used to continuously publish internal build artifacts</li>
    <li>How a repository manager simplifies the process of building and deploying systems to production</li>
    <li>How a repository manager can act as a gateway between vendors and external partners</li>
</ul>

<p><a href="http://www.sonatype.com/people/wp-content/uploads/2010/08/old-school.png"><img class="aligncenter size-full wp-image-5899" title="old-school" src="http://www.sonatype.com/people/wp-content/uploads/2010/08/old-school.png" alt="" width="395" height="272" /></a></p>

<h2>When you don&#8217;t use a Repository Manager</h2>

<p>Before I get started on the benefits of repository management, I want to talk about the realities you face when you don&#8217;t use a repository manager. Here are some common anti-patterns when you don&#8217;t use a repository manager:</p>

<ul>
    <li><strong>All of your developers download artifacts directly from public repositories.</strong> A new developer starts on a Monday. That developer will spend an hour downloading a massive library of dependencies from Maven Central. Worse, if Maven Central happens to be down that day, they will be out of luck entirely.</li>
    <li><strong>Proprietary or Vendors libraries are passed around, from developer to developer.</strong> If you don&#8217;t use a repository manager, how do you distribute the Oracle JDBC driver? Maybe you place it in a shared file system and tell people to download it and install it in ~/.m2/repository. More likely, developers just pass this JAR around as an email attachment with some ad-hoc instructions.</li>
    <li><strong>JARs are checked into source control</strong>. If you don&#8217;t use a tool like Maven, which knows how to download artifacts from a remote repository, you might be following the very common pattern of checking binary dependencies and libraries into source control. I&#8217;ve seen many instances of companies creating ad-hoc JAR repositories and checking these repositories into source control, only to version and branch these static binary files with every release.</li>
    <li><strong>The source control repository is used to store <em>everything</em></strong> from source code to binary builds. Because there is no repository designed to store binaries, developers start to use tools like Subversion to keep track of binaries. As time passes, the Subversion repository becomes an ad-hoc file system for files that have no business in an SCM.</li>
    <li><strong>The continuous integration server depends on public repositories</strong>. When you change your build or add a new dependency, your CI system downloads dependencies from the public repo. It depends on the availability of this public resource to run builds.</li>
    <li><strong>Production deployments have to run the entire build</strong>, from start to finish, to generate binaries for deployment. When a build is tested and then ultimately pushed to production, the build and deployment scripts checkout source code, run the build, and deploy the resulting binaries to production systems.</li>
    <li><strong>Sharing source code with external partners means granting them access to your SCM.</strong>  Since there is no established mechanism for publishing source or binary artifacts, the only way to share code with partners is to either send an archive of your source, or provide them with direct access to your SCM.</li>
</ul>

<p>The general theme in all of these anti-patterns is that either your systems depend on public resources, or they all depend on the SCM system as a central collaboration point. In the next few posts, I&#8217;m going to detail how using a repository manager provides a solution for each of these issues. I&#8217;ll go into why each of these anti-patterns is a bad idea, and how you can use Maven, Nexus, and Hudson together to solve these problems and create a more efficient software development effort.</p>

<p><em>Stay tuned for the next post: Caching and Collaborating.</em></p>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-i/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Listen to Brian Fox discuss Maven 3 on BasementCoders.com</title>
		<link>http://www.sonatype.com/people/2010/08/listen-to-brian-fox-discuss-maven-3-on-basementcoders-com/</link>
		<comments>http://www.sonatype.com/people/2010/08/listen-to-brian-fox-discuss-maven-3-on-basementcoders-com/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 13:00:06 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Apache Maven]]></category>
		<category><![CDATA[Brian Fox]]></category>
		<category><![CDATA[Maven 3]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=5893</guid>
		<description><![CDATA[
		
		
		
		Craig Tataryn of BasementCoders.com interviewed Brian Fox about the upcoming release of Maven 3.  From Basementcoders.com:

&#8220;With the Maven 3 betas being out and packing a tonne of cool features we decided that we needed to sit down and talk with someone in the know. Enter Brian Fox, PMC Chair Apache Maven and VP of [...]]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: left; width: 42px; padding-right: 10px; margin: 0 10px 0 0;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://www.sonatype.com/people/2010/08/listen-to-brian-fox-discuss-maven-3-on-basementcoders-com/";
		var dzone_title = "Listen to Brian Fox discuss Maven 3 on BasementCoders.com";
		var dzone_style = "1";
		var dzone_blurb = "Craig Tataryn of BasementCoders.com interviewed Brian Fox about the upcoming release of Maven 3.  From Basementcoders.com:&#8220;With the Maven 3 betas being out and packing a tonne of cool features we decided that we needed to sit down and talk with...";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><p><a href="http://www.sonatype.com/people/wp-content/uploads/2009/10/maven.png"><img class="alignright size-full wp-image-3145" title="maven" src="http://www.sonatype.com/people/wp-content/uploads/2009/10/maven.png" alt="" width="250" height="72" /></a>Craig Tataryn of BasementCoders.com <a href="http://www.dzone.com/links/r/episode_13_maven_3_interview_with_pmc_chair_brian.html">interviewed Brian Fox about the upcoming release of Maven 3</a>.  From Basementcoders.com:</p>

<blockquote>&#8220;With the Maven 3 betas being out and packing a tonne of cool features we decided that we needed to sit down and talk with someone in the know. Enter Brian Fox, PMC Chair Apache Maven and VP of Engineering at Sonatype (the fellows who make Maven Repositories manageable via their Nexus product).&#8221;</blockquote>

<p>This interview touches upon Brian&#8217;s background in build management and developer infrastructure, and how Brian started to use Maven and became involved in the Apache Maven project.   You will also hear Brian discuss the history of Maven, the motivations behind the project, some comparisons between Maven and Ant, and new features planned for the Maven 3 release.</p>

<p>To listen to the full interview, <a href="http://www.dzone.com/links/r/episode_13_maven_3_interview_with_pmc_chair_brian.html">click here</a>.</p>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2010/08/listen-to-brian-fox-discuss-maven-3-on-basementcoders-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
