<?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; Mercury</title>
	<atom:link href="http://www.sonatype.com/people/category/mercury-maven/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>Thu, 09 Feb 2012 15:48:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Nexus Book (Edition 2.0): Fixes, Refactored Introduction</title>
		<link>http://www.sonatype.com/people/2009/12/update-to-nexus-book-edition-20-small-bug-fixes-refactored-introduction/</link>
		<comments>http://www.sonatype.com/people/2009/12/update-to-nexus-book-edition-20-small-bug-fixes-refactored-introduction/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 21:39:51 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Book]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[m2eclipse]]></category>
		<category><![CDATA[Mercury]]></category>
		<category><![CDATA[Nexus]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=3615</guid>
		<description><![CDATA[Even though many of you are busily enjoying the year-end holidays, we&#8217;re busy at work trying to make quality software. We&#8217;ve just cut Edition 2.0 of &#8220;Repository Management with Nexus&#8221;, this edition has some important bug fixes and a refactored introduction. Much of the introductory &#8220;What is a Repository?&#8221; material has been pulled out of [...]]]></description>
			<content:encoded><![CDATA[<p>Even though many of you are busily enjoying the year-end holidays, we&#8217;re busy at work trying to make quality software.    We&#8217;ve just cut Edition 2.0 of &#8220;Repository Management with Nexus&#8221;, this edition has some important bug fixes and a refactored introduction.    Much of the introductory &#8220;What is a Repository?&#8221; material has been pulled out of the introduction and placed into a new chapter dedicated to the concepts of repository management.</p>

<p>For a list of changes in Edition 2.0, please see <a href="http://www.sonatype.com/books/nexus-book/reference/foreword.html#d0e69">the release notes for this edition</a> in the Nexus book.</p>

<ul>
  <li><a href="http://www.sonatype.com/books/nexus-book/reference/">Read the Book <b>for FREE</b> online</a>,</li>
  <li><a href="http://www.sonatype.com/nexus/documentation/download-book?file=books/nexus-book.pdf">Download the Nexus Book PDF</a>, or</li>
  <li><a href="http://www.scribd.com/doc/16027005/Repository-Management-with-Sonatype-Nexus">Read the Book on Scribd</a></li>
</ul>

<p>Special thanks to John Yeary and Anders Hammar for providing essential feedback and for identifying typos and errors.</p>

<p><a title="View Repository Management with Sonatype Nexus on Scribd" href="http://www.scribd.com/doc/16027005/Repository-Management-with-Sonatype-Nexus" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;">Repository Management with Sonatype Nexus</a> <object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="doc_543712692586485" name="doc_543712692586485" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" align="middle"  height="500" width="100%" >     <param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf?document_id=16027005&#038;access_key=key-1sqwnlhh1jbhs8g5wrci&#038;page=1&#038;version=1&#038;viewMode=book">        <param name="quality" value="high">         <param name="play" value="true">        <param name="loop" value="true">        <param name="scale" value="showall">        <param name="wmode" value="opaque">         <param name="devicefont" value="false">     <param name="bgcolor" value="#ffffff">      <param name="menu" value="true">        <param name="allowFullScreen" value="true">         <param name="allowScriptAccess" value="always">         <param name="salign" value="">                      <param name="mode" value="book">                <embed src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=16027005&#038;access_key=key-1sqwnlhh1jbhs8g5wrci&#038;page=1&#038;version=1&#038;viewMode=book" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" scale="showall" wmode="opaque" devicefont="false" bgcolor="#ffffff" name="doc_543712692586485_object" menu="true" allowfullscreen="true" allowscriptaccess="always" salign="" type="application/x-shockwave-flash" align="middle" mode="book" height="500" width="100%"></embed>  </object></p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.sonatype.com/people/2009/12/update-to-nexus-book-edition-20-small-bug-fixes-refactored-introduction/&via=SonatypeCM&text=Nexus Book (Edition 2.0): Fixes, Refactored Introduction&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2009/12/update-to-nexus-book-edition-20-small-bug-fixes-refactored-introduction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven 3.x: Paving the desire lines &#8212;  Part One</title>
		<link>http://www.sonatype.com/people/2009/11/maven-3x-paving-the-desire-lines-part-one-2/</link>
		<comments>http://www.sonatype.com/people/2009/11/maven-3x-paving-the-desire-lines-part-one-2/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 08:32:29 +0000</pubDate>
		<dc:creator>Jason van Zyl</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[How-To]]></category>
		<category><![CDATA[m2eclipse]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Mercury]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Sonatype]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=3292</guid>
		<description><![CDATA[Maven 3.0 With Maven 3.x we have made our best attempt to listen to users, find out what they need and want, and make reasonable preparations and plans to fix the problems, implement useful features, and create the integration points for working properly with third-party systems like Nexus and Hudson. While there have been many [...]]]></description>
			<content:encoded><![CDATA[<!-- Generated by Markdown to HTML in MarsEdit -->

<h1>Maven 3.0</h1>

<p>With Maven 3.x we have made our best attempt to listen to users, find out what they need and want, and make reasonable preparations and plans to fix the problems, implement useful features, and create the integration points for working properly with third-party systems like Nexus and Hudson. While there have been many new feature requests &#8212; and we have many new features done or in the works &#8212; the number one concern is backward compatibility. Maven 3.x makes an ardent attempt to be 100% backward-compatible with Maven 2.x. All your Maven 2.x builds should work out of the box using 3.x without change to your projects. We simply can&#8217;t cause pain to the existing user base. We are very cognizant that even small changes can have a huge impact and so we have tried achieve complete Maven 2.x fidelity with Maven 3.x.</p>

<p>In Maven 3.x we have reduced the number of modules, we have simplified and extracted the artifact resolution system, we have put a performance framework in place, and we have created an enormous set of integration tests for Maven&#8217;s core and for many of the core plugins. We are constantly trying to validate core features and core plugins are working properly. We hope with the simplifications that we have made that more people will get involved in the project. We have done some heavy overhauling of many of the internals to make way for future features and I believe Maven 3.x is really the only path forward for Maven. What&#8217;s the technique we used to decide on how to plan and work toward the completion of Maven 3.x? A very practical approach to determining an optimal path called desire lines.</p>

<h2>Desire Lines</h2>

<p>A desire line usually represents the shortest or most easily navigated route between an origin and destination. The width and amount of erosion of the line represents the amount of demand. The term was coined by Gaston Bachelard in his book The Poetics of Space. Desire lines can usually be found as shortcuts where constructed pathways take a circuitous route. A concrete example: the pathways around the Berkeley campus in California. During the early years of Berkeley no pathways were paved. Instead they let inhabitants walk in optimal paths between the buildings and location over a period time to form clear pathways over the grass. Once these pathways had been established they could be paved to make the pathway more permanent. This is very similar to what happened with Maven 2.x. Consider Maven 2.x the pathways marked in the grass. Consider Maven 3.x taking all that learning from Maven 2.x and adopting the optimal form of use and codifying those forms of use i.e. paving the desire lines.</p>

<p>Over the course of hundreds of thousands of people using Maven we have a very good idea of what these optimal pathways look like now. Here are a few examples of some of the things we&#8217;ve seen and the things we have to do in order to make these lasting improvements.</p>

<h2>Responding to invitations for improvement</h2>

<p><img src="http://www.sonatype.com/people/wp-content/uploads/2009/11/desireline11.png" alt="DesireLine1.png" border="0" width="666" height="500" /></p>

<p>There are many things in Maven 2.x that work reasonably well but have some minor flaws which cause irritation:</p>

<ul><li>Dependency management. How to effectively manage what we will call a target platform (intentionally using the Eclipse nomenclature). It is easy to manage the versions of an applications runtime or its target platform. But what happens when you start pulling in multiple, separately developed target platforms.</li><li>Version specifications and version ranges. Maven&#8217;s notion of this is workable, but when it comes to the version specification and ranges it&#8217;s time to just defer to OSGi in this regard. What OSGi specifies and what Maven specifies are not wildly different but different enough to cause some problems. We&#8217;ll be working on aligning Maven to the version specification of OSGi.</li><li>The way plugins interact with embedded environments was just wrong. We allowed for no support for incremental changes. The result is that in M2Eclipse when you change an individual resource, that individual resource can be processed efficiently and not fire up all of Maven to run the whole build lifecycle. Sorry, but you won&#8217;t have time to get a coffee anymore.</li><li>There are slew more, but we&#8217;ll save those for other blog entries.</li></ul>

<h2>Responding to &#8230; being completely wrong</h2>

<p><img src="http://www.sonatype.com/people/wp-content/uploads/2009/11/desireline2.jpg" alt="DesireLine2.jpg" border="0" width="375" height="500" /></p>

<p>There are some things in Maven 2.x we just didn&#8217;t get right and we have to make reparations:</p>

<ul><li>Composition versus inheritance in the POM. There are some great debugged toolchains like we have in the Apache Organization POM for releasing, but this toolchain is not easily consumable by outside projects because it makes no sense to inherit from the Apache Organization POM for your projects. So how can we make these chunks of debugged combinations of plugins and their associated configuration? We will introduce mixins to help with this. Essentially it will be a POM consisting of plugins and configurations that can be externally parameterized. These mixins will be deployed to a repository and be referenced with a standard coordinate. Basically it will be an intelligent import with validation which will allow composition in your POMs.</li><li>Checking out the whole source tree versus an individual module and parent element versioning. We have always intentionally made projects specify versions in the parent elements. When you check out individual modules this is necessary. But for projects where the whole source tree is checked out, the version of the parent can be inferred and the requirement for specifying the version element in the parent can be removed.</li><li>Clean separation of operations that need to happen at the beginning and end of the lifecycle versus in the lifecycle itself. To make the OSGi integration we created work we needed to get at the projects before the build lifecycle was executed so we added a clear hook before lifecycle execution. What we have done to make OSGi integration work in Maven 3.x is simply not possible in Maven 2.x. We also had a terrible problem with reporting and aggregation because there was no clear point at which the lifecycle was over. Now once the build lifecycle is complete there is a clear hook to get the projects in the reactor so they can be processed easily. Accurate aggregation is now possible.</p></li><li>Again, there are slew more, but we&#8217;ll also save those for other blog entries.</li></ul>

<h2>Responding to under-utilization of what exists</h2>

<p>Unfortunately there are still a lot of powerful features and plugins in Maven that a lot of people don&#8217;t know about. We have tried to remedy this situation with the four books that we constantly update stream, and a stream of blog posts, and the soon to be enterprise Maven users list which will focus on the holistic and systematic use of Maven, M2Eclipse, Nexus and Hudson. We need to do a better job explaining end-to-end best practices for developing, testing, and provisioning software. We also need to do a better job describing some of the incredibly useful plugins we have like the enforcer plugin and the dependency plugin.</p>

<p>But again, our best attempt to show people what is available through the four books that we have:</p>

<ul><li><a href="http://www.sonatype.com/documentation/books/maven-defguide">Maven: The Definitive Guide</a></li><li><a href="http://books.sonatype.com/nexus-book/">Repository Management with Nexus</a></li><li><a href="http://books.sonatype.com/m2eclipse-book/reference">Developing with Eclipse and Maven</a></li><li><a href="http://books.sonatype.com/mhandbook/reference">The Maven Handbook</a></li></ul>

<p>Here is a picture I always use to illustrate the point that even though something may be sitting directly in front of you, it&#8217;s not always immediately obvious unless someone points it out to you. Th
is is very much the case where we see users asking us for help with particular use cases and in frequently it&#8217;s very easy to answer the question by pointing to a URL. My example is the Fedex logo which was designed to have an arrow being formed between the last two letters of the logo. Quite ingenious but most people I point this out to haven&#8217;t notice it. </p>

<p><img src="http://www.sonatype.com/people/wp-content/uploads/2009/11/fedex11.png" alt="Fedex1.png" border="0" width="588" height="175" /></p>

<p><img src="http://www.sonatype.com/people/wp-content/uploads/2009/11/fedex21.png" alt="Fedex2.png" border="0" width="588" height="175" /></p>

<p>We are going to try a lot harder to make sure the value that exists is easier to find. I don&#8217;t enjoy reading blog posts from unhappy users at all, but I especially don&#8217;t like it when I know there is a solution which has been documented somewhere. Those painful situations can be reduced if not eliminated completely.</p>

<h2>Backward Compatibility</h2>

<p>I can&#8217;t stress enough how important backward compatibility is to us. We have done a non-trivial amount of work to pave the way for new capabilities in Maven 3.x while preserving 100% backward compatibility for:</p>

<ul><li>Maven itself and the behaviour that users expect from the CLI</li><li>Artifact Resolution API</li><li>Plugin API</li><li>Plugin configuration</li><li>Site generation (even though we&#8217;ve extracted site/reporting entirely into the maven-site-plugin)</li></ul>

<p>We must ensure that plugins and reports written against the Maven 2.0.x APIs remain viable in 3.0. We don&#8217;t want people rewriting their plugins or having to change their projects at all or it will simply be chaos. We simply have too many users and requiring changes will have an enormous human cost so we&#8217;ve been slow in announcing Maven 3.x. The version of Maven 3.x you can pull from the Sonatype grid is probably the best version of Maven that has existed but we are still being careful about releasing it. If you want to try it you can find it <a href="https://grid.sonatype.org/ci/view/Maven%203.0.x/job/maven-3.0.x-bootstrap/">here</a>.</p>

<p>We must also ensure that POMs of version 4.0.0 are supported in 3.x along with the behavior currently experienced. We will need to make changes to the POM in order to introduce many of the new features so we&#8217;ve made the requisite preparation. We are relying heavily on our integrations tests right now but as we move forward the work that Benjamin is doing on the project/model-builder will help us to accommodate different versions of a POM, and different formats we decide to support.  The model-builder code has no limitation with respect to formats. We can support XML, or any source that anyone can dream up. These implementations may find use outside of Maven. For example someone might build something with the Maven, JRuby, and Mercury to create a JRuby-based system. The same could be done for Groovy. We already have some examples of this with the Polyglot Maven project we&#8217;ve started which will be the topic of a subsequent post.</p>

<p>We have managed to keep almost everything backward compatible and we will go so far as to provide an isolated execution environment that can contain older versions of the plugin API so that everything from the past can continue to work in Maven 3.x. We will not truly be able to do this until we change the internal Maven runtime over to OSGi but we know what needs to be done. </p>

<h2>Integration Testing</h2>

<p>An enormous amount of time and energy has gone into improving the the integration tests for Maven. The integration tests are the gatekeeper and let us determine that we have a Maven 3.x that is compatible for Maven 2.x. We now have 506 integration tests that will help protect us as we move forward. We will likely approach 600 integration tests by the time we reach the Maven 3.0 GA.</p>

<p>All core Maven plugins now have ITs and we have started branching out into the Mojo project to create plugin ITs there as well. We have a good pattern so we are encouraging anyone writing a Maven plugin to create ITs so that we can help ensure we don’t break people in the future. We have really taken fixing the problems we see seriously. I couldn&#8217;t help but make a little spoof of the SNL skit and adapting it for the Maven perspective.</p>

<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/kaT-jFpwj_M&amp;hl=en&amp;fs=1&amp;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/kaT-jFpwj_M&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>

<p>In the next post I will start talking about some of the technical changes we have made to Maven 3.x in order to achieve our goals. Those will include:</p>

<ul><li>Refactored model/project builder (the support Polyglot Maven uses)</li><li>Queryable lifecycle</li><li>Lifecycle Extension points</li><li>Error and integrity reporting</li><li>Mercury: Jetty Client &amp; SAT4J</li><li>Embedding</li><li>Incremental build support (used heavily in M2Eclipse for performance improvements, these are changes to the plugin API)</li></ul>

<p>I plan to try and write something about Maven 3.x frequently in preparation for the Maven 3.x talks in <a href="http://www.javaforum.se/jf/index.jsp?meeting=53">Stockholm</a>, <a href="http://rheinjug.de/knowledge/vortr-mainmenu-28/108-maven-3-mit-jason-van-zyl">Dusseldorf</a>, <a href="http://87.230.78.21:8080/display/jugc/2009.11.16+Maven+3">Cologne</a>, and <a href="http://oredev.org/maven">Devoxx</a>.</p>

<p>Stay tuned!</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.sonatype.com/people/2009/11/maven-3x-paving-the-desire-lines-part-one-2/&via=SonatypeCM&text=Maven 3.x: Paving the desire lines --  Part One&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2009/11/maven-3x-paving-the-desire-lines-part-one-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Features in Nexus and Nexus Professional 1.4</title>
		<link>http://www.sonatype.com/people/2009/10/new-features-in-nexus-and-nexus-professional-14/</link>
		<comments>http://www.sonatype.com/people/2009/10/new-features-in-nexus-and-nexus-professional-14/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 16:22:07 +0000</pubDate>
		<dc:creator>Brian Fox</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Mercury]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[Book]]></category>
		<category><![CDATA[nexus pro]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=3075</guid>
		<description><![CDATA[The Nexus Professional 1.4 release offers a wide array of features Proxy Repository Browsing &#8211; With Nexus 1.4, the local cache and logical index views have been separated into separate tabs. We found that the previous single tab with a combo box to select the source was confusing. Publishing Web Sites to Nexus Professional &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>The Nexus Professional 1.4 release offers a wide array of features</p>

<ul>
    <li><strong>Proxy Repository Browsing</strong> &#8211; With Nexus 1.4, the local cache and logical index views have been separated into separate tabs. We found that the previous single tab with a combo box to select the source was confusing.
<img class="aligncenter size-medium wp-image-3087" title="repository-manager_browse-repository-index" src="http://www.sonatype.com/people/wp-content/uploads/2009/10/repository-manager_browse-repository-index-273x300.png" alt="repository-manager_browse-repository-index" width="273" height="300" /></li>
    <li><strong>Publishing Web Sites to Nexus Professional</strong> &#8211; Nexus Professional 1.4 provides you with a WebDAV endpoint for publishing a web site.  You can configure a Site repository that can be used as a publishing destination for project documentation. This means you don&#8217;t have to worry about providing some alternate solution to host your reports. The full support of Nexus security applies to this new type of repository, so you can control access at a very fine grained level.
<img class="aligncenter size-medium wp-image-3089" title="sites-new-repo" src="http://www.sonatype.com/people/wp-content/uploads/2009/10/sites-new-repo-300x168.png" alt="sites-new-repo" width="300" height="168" /></li>
    <li><strong>Repository Configuration Changes</strong>
<ul>
    <li><strong>Fine-grained control of Redeployment for Hosted Repositories:</strong> Nexus 1.4 provides administrators a simplied way to control how a hosted repository deals with the redeployment of artifacts.   You can configure a repository to allow for the redeployment of previously deployed artifacts, allow for one-time deployment, or to provide a read-only interface for clients.<img class="aligncenter size-medium wp-image-3090" title="repository-manager_repository-config-3" src="http://www.sonatype.com/people/wp-content/uploads/2009/10/repository-manager_repository-config-3-300x179.png" alt="repository-manager_repository-config-3" width="300" height="179" /></li>
</ul>
</li>
    <li><strong>Improvements to the Staging Plugin</strong> &#8211; The staging plugin had numerous improvements in the 1.4 release to increase usability and provide new functions for staging artifact bundle and verifying that staging repositories follow user configurable rule sets.
<ul>
    <li><strong>Support for Staging Rulesets:</strong> Nexus Professional 1.4 provides administrators with the ability to define a set of rules to apply to staging repositories before they can be promoted.    The 1.4 release can validate that staging repositories contain valid POMs, valid PGP signatures, javadocs, and sources for all artifacts. The rules are pluggable and we expect to add more rules in the near future to support the <a href="http://repository.apache.org">Apache repository</a> and our <a href="http://oss.sonatype.org">OSS hosting repository</a></li>
    <li><strong>Support for Uploading Artifact Bundles:</strong> The staging plugin now accepts artifact bundle uploads.  Artifact bundles are archives which contain one or more associated artifacts, they are used to publish artifacts to the Central Maven repository, and you can use Artifact bundles to validate artifacts uploaded to Nexus.</li>
    <li><strong>General Usability Improvements in the Staging Plugin:</strong> This release of the Staging plugin focused on usability, the Staging plugin is full of improvements that make the user interface more intuitive and easier to use.</li>
</ul>
</li>
    <li><strong>User Account Plugin</strong> &#8211; The User Account Plugin in Nexus Professional gives unauthenticated Nexus users the ability to sign-up for a Nexus account.    When this feature is enabled, a new user would click a sign-up link, fill out a simple profile form, read a captcha, and then activate a new account via an email confirmation message.   Nexus Administrators can configure the default roles and permissions that are granted to newly signed up users.
<img class="aligncenter size-medium wp-image-3092" title="user-account_sign-up-form" src="http://www.sonatype.com/people/wp-content/uploads/2009/10/user-account_sign-up-form-300x261.png" alt="user-account_sign-up-form" width="300" height="261" /></li>
    <li><strong>Repository Summary Panel</strong> &#8211; The repository summary panel provides statistics and configuration information for a specific repository.    Users can consult the repository summary panel to gather the necessary distribution management settings for Maven configuration.
<img class="aligncenter size-medium wp-image-3093" title="repository-manager_summary-hosted" src="http://www.sonatype.com/people/wp-content/uploads/2009/10/repository-manager_summary-hosted-293x300.png" alt="repository-manager_summary-hosted" width="293" height="300" /></li>
    <li><strong>Security Improvements</strong> &#8211; Many improvements to the user security model.   In general, it is now easier to configure custom role mappings for externally managed users, and Sonatype has paid close attention to the user interface for managing users and roles.   It is easier than ever to configure and secure a Nexus repository.
<ul>
    <li><strong>New User Role Tree:</strong> Click on a user and then click on the user role tree to see how each role contributes to the permissions for a particular user.
<img class="aligncenter size-medium wp-image-3094" title="repository-manager_security-users-role-tree" src="http://www.sonatype.com/people/wp-content/uploads/2009/10/repository-manager_security-users-role-tree-300x275.png" alt="repository-manager_security-users-role-tree" width="300" height="275" /></li>
    <li><strong>New User Privilege Trace feature:</strong> this features allows Nexus administrators to pinpoint which roles contribute which permissions to a particular user.   While the user role tree provides an intuitive interface that lists role in a hierarchy, the privilege trace panel under user administration provides an alternate view.   Click on a particular permission to find the roles contribute that permission to a user.
<img class="aligncenter size-medium wp-image-3095" title="repository-manager_security-users-privilege" src="http://www.sonatype.com/people/wp-content/uploads/2009/10/repository-manager_security-users-privilege-300x275.png" alt="repository-manager_security-users-privilege" width="300" height="275" /></li>
    <li><strong>New Role Tree:</strong> Since a Nexus role can consist of both roles and privileges, we&#8217;ve provided an intuitive tree browser that allows an administrator to browse the hierarchy of roles and privileges associated with a Nexus Role.</li>
    <li><strong>Fine-grained control of View Repository Privilege:</strong> Nexus added the ability to configure a role to prevent users from browsing particular repositories. This is used to provide a cleaner view to users, for example to show them only groups they use via Maven and not confuse them with all the repositories aggregated by that group.</li>
</ul>
</li>
    <li><strong>Integration with Atlassian Crowd</strong> &#8211; Atlassian Crowd is a capable user and directory management system that can consolidate authorization and authentication to a central server.  Nexus Professional&#8217;s Atlassian Crowd plugin provides seamless integration between Nexus and Atlassian&#8217;s Crowd server.
<img class="aligncenter size-medium wp-image-3096" title="crowd_server-config-access-settings" src="http://www.sonatype.com/people/wp-content/uploads/2009/10/crowd_server-config-access-settings-300x119.png" alt="crowd_server-config-access-settings" width="300" height="119" /></li>
    <li><strong>Automated Nexus Error Reporting</strong> &#8211; Nexus 1.4 ships with an automated error repository system which can be configured to report Nexus exceptions and errors to the Nexus Issue Tracker. If configured, the system will send data to Sonatype&#8217;s Jira instance. The information contained includes the configuration (all passwords are obfuscated) as well as a file list of the repositories and exception traces. All of this data is encrypted using public-key cryptography so only Sonatype can view the contents. We expect that this information will allow us to further refine the stability of Nexus.</li>
    <li><strong>Upgrades to the Nexus Book</strong>
<ul>
    <li>A new chapter on Nexus Best Practices.</li>
    <li>A new chapter on publishing web sites to Nexus.</li>
    <li>Over 100 corrections and clarifications.</li>
    <li>Over 80 new figures and diagrams.</li>
    <li>Addition of a New Nexus Book Cover with the Nexus Logo</li>
</ul>
<img class="aligncenter size-medium wp-image-3098" title="nexus-book-cover-01" src="http://www.sonatype.com/people/wp-content/uploads/2009/10/nexus-book-cover-01-230x300.png" alt="nexus-book-cover-01" width="230" height="300" /></li>
</ul>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.sonatype.com/people/2009/10/new-features-in-nexus-and-nexus-professional-14/&via=SonatypeCM&text=New Features in Nexus and Nexus Professional 1.4&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2009/10/new-features-in-nexus-and-nexus-professional-14/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is a Repository Manager?</title>
		<link>http://www.sonatype.com/people/2009/04/what-is-a-repository-manager/</link>
		<comments>http://www.sonatype.com/people/2009/04/what-is-a-repository-manager/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 14:07:05 +0000</pubDate>
		<dc:creator>Tim O'Brien</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Mercury]]></category>
		<category><![CDATA[Nexus]]></category>
		<category><![CDATA[Sonatype]]></category>
		<category><![CDATA[central]]></category>
		<category><![CDATA[nexus pro]]></category>
		<category><![CDATA[repository]]></category>
		<category><![CDATA[repository management]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=1923</guid>
		<description><![CDATA[Download &#8220;Introduction to Repository Management&#8221; as a PDF What is a Repository Manager? A proxy for remote repositories which caches artifacts saving both bandwidth and time required to retrieve a software artifact from a remote repository, and A host for internal artifacts providing an organization with a deployment target for software artifacts. In addition to [...]]]></description>
			<content:encoded><![CDATA[<p>
<b><a onClick="javascript: pageTracker._trackPageview('/whitepaper/intro-repoman');" href="http://www.sonatype.com/sites/default/files/whitepapers/Intro-RepoManagement.pdf">Download &#8220;Introduction to Repository Management&#8221; as a PDF</a></b>
</p>

<h2>What is a Repository Manager?</h2>

<ul>
  <li>A proxy for remote repositories which caches artifacts saving both bandwidth and time required to retrieve a software artifact from a remote repository, and</li>
  <li>A host for internal artifacts providing an organization with a deployment target for software artifacts.</li>
</ul>

<p>In addition to these two core features, a repository manager also allows you to manage binary software artifacts through the software development, quality assurance, and production release lifecycle.   In addition to these core features, a repository manager can search software artifacts, audit development and release transactions, and integrate with external security systems such as LDAP.   A repository manager is a powerful tool that encourages collaboration and provides visibility into the workflow which surrounds binary software artifacts.</p>

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

<p>A richer, more detailed description of the features of a repository manager include:</p>

<h3>Management of Software Artifacts</h3>

<p>A repository manager is able to manage packaged binary software artifacts.   In Java development, this would include JARs containing bytecode, source, or javadoc.   In other environments, such as Flex, this would include any SWCs or SWFs generated by a Flex build.</p>

<h3>Management of Software Metadata</h3>

<p>A repository manager should have some knowledge of the metadata which describes artifacts.   In a Maven repository this would include project coordinates (groupId, artifactId, version, classifier) and information about a given artifact’s releases.</p>

<h3>Proxying of External Repositories</h3>

<p>Proxying an external repository yields more stable builds as the artifacts used in a build can be served to clients from the repository manager’s cache even if the external repository becomes unavailable.    Proxying also saves bandwidth and time as checking for the presence of an artifact on a local network is often orders of magnitude faster than querying a heavily loaded public repository.   Proxying an external repository such as the Central Maven repository is also an act of good citizenship; reducing the bandwidth burden on Central helps to preserve a valuable public resource.</p>

<h3>Deployment to Hosted Repositories</h3>

<p>Organizations which deploy internal snapshots and releases to hosted repositories have an easier time distributing software artifacts across different teams and departments.  When a department or development group deploys artifacts to a hosted repository, other departments and development groups can develop systems in parallel, relying upon dependencies served from both release and snapshot repositories.   Finding an efficient way to distribute the binary software artifacts during the development cycle is essential for an organization that needs to scale system complexity and number of developers.  Once you start using Nexus as a sharing mechanism across development teams, each team can then focus on smaller, more manageable systems.    The web application team can focus on the code that directly supports the web application while it depends on the binary software artifacts from a team managing an Enterprise Service Bus. </p>

<h3>Searching an Index of Artifacts</h3>

<p>When you collect software artifacts and metadata in a repository manager, you gain the ability to create indexes and allow users and systems to search for artifacts.   With a Nexus index, an IDE such as Eclipse has almost instantaneous access to the contents of all proxy repositories (including the Central repository) as well as access to your own internal and 3rd party artifacts.   If a user needs to search for a particular artifact, they can use the built-in auto-completion capabilities of Eclipse, and the IDE will perform a query against an index of the repository.   If you need to update a library to the latest version, click on the POM editor and use the auto-complete feature in m2eclipse.   If you need to search for all artifacts which contain a specific class name, you can use m2eclipse to search an index of Maven repository artifacts by class name.     While the Central repository transformed the way that software is distributed, the Nexus index format brings the power of search to massive libraries of software artifacts.</p>

<h3>Infrastructure for Artifact Management</h3>

<p>A repository manager should also provide the appropriate infrastructure for managing software artifacts and a solid API for extension.  In Nexus, Sonatype has provided a plugin API which allows developers to customize both the behavior and functionality of the tool.   Here are just some of the features which are available as Nexus Plugins in Nexus Professional:  Release Audits and Compliance, Support for Workflow and Process, Integration with External Security Providers.</p>

<h2>Enterprise Repository Management</h2>

<p>Once you adopt the core features of a repository manager, you start to view a product like Nexus Open Source or Nexus Professional as a tool which enables more efficient collaboration between development groups.  Nexus Professional builds upon the foundations of a repository manager and adds capabilities such as Procurement and Staging.</p>

<h3>Managing Project Dependencies</h3>

<p>Many organizations require some level of oversight over the open source libraries and external artifacts that are let into an organization’s development cycle.   An organization could have specific legal or regulatory constraints which require every dependency to be subjected to a rigorous legal or security audit before it is integrated into a development environment.   Another organization might have an architecture group which needs to make sure that a large set of developers only have access to a well-defined list of dependencies or specific versions of dependencies.   Using the Procurement features of Nexus Professional, managers and architecture groups have the ability to allow and deny specific artifacts from external repositories.</p>

<h3>Managing a Software Release</h3>

<p>Nexus Professional adds some essential workflow to the process of staging software to a release repository.    Using Nexus Professional, developers can deploy to a staging directory which can trigger a message to a Release Manager or to someone responsible for QA.  Quality assurance (or a development manager) can then test and certify a release having the option to promote a release to the release repository or to discard a release if it didn’t meet release standards.    Nexus Professional’s staging features allow managers to specify which personnel are allowed to certify that a release can be promoted to a release repository giving an organization more control over what software artifacts are released and who can release them.</p>

<h3>Integration with LDAP</h3>

<p>Nexus Professional integrates with an LDAP directory, allowing an organization to connect Nexus to an existing directory of users and groups.   Nexus authenticates users against an LDAP server and provides several mechanisms for mapping existing LDAP groups to Nexus roles.</p>

<h3>Advanced Security</h3>

<p>Using Nexus Professional, an organization can define a master User Password Encryption Key.   Each user will be given a separate Maven settings file with an encrypted password using the Maven Nexus plugin.   When users interact with Nexus, Nexus uses the User Password Encryption Key to decrypt a user’s Nexus credentials avoiding the need to send an easily compromised plain-text password over the network.</p>

<h3>Settings Templates</h3>

<p>Nexus Professional allows you to define Maven settings templates for developers.   Developers can then automatically receive updates to Maven settings (~/.m2/settings.xml) using the Maven Nexus plugin.    The ability to define Maven settings templates and to distribute customized Maven settings files to developers makes it easy for an organization to change global profiles or repository configuration without relying on developers to manually install a new settings file in a development environment.</p>

<h3>p2 Repository Support</h3>

<p>Nexus Professional supports the p2 repository format used by the new Eclipse provisioning platform.   You can use the p2 plugin to consolidate, provision, and control the plugins that are being used in an Eclipse IDE.   Using Nexus procurement, repository groups, and proxy repositories to consolidate multiple plugin repositories, an organization can use Nexus Professional to standardize the configuration of Eclipse IDE development environments.</p>

<p>For more Information about Sonatype Nexus:
<a href="http://www.sonatype.com/products/nexus">http://www.sonatype.com/products/nexus</p>

<p>To download your free trial of Nexus Professional:
<a href="http://www.sonatype.com/products/downloads">http://www.sonatype.com/products/downloads</a></p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.sonatype.com/people/2009/04/what-is-a-repository-manager/&via=SonatypeCM&text=What is a Repository Manager?&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2009/04/what-is-a-repository-manager/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dirty Tree &#8211; Resolved Tree &#8211; Resolved Graph</title>
		<link>http://www.sonatype.com/people/2009/03/dirty-tree-resolved-tree-resolved-graph/</link>
		<comments>http://www.sonatype.com/people/2009/03/dirty-tree-resolved-tree-resolved-graph/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 01:34:36 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Mercury]]></category>
		<category><![CDATA[Sonatype]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=1883</guid>
		<description><![CDATA[Notions of Dirty Tree, Resolved Tree and Resolved Graph are floating around the resolution process. Here is the clarification &#8211; what is what: Tweet]]></description>
			<content:encoded><![CDATA[<p>Notions of <em>Dirty Tree</em>, <em>Resolved Tree</em> and  <em>Resolved Graph</em> are floating around the resolution process. Here is the clarification &#8211; what is what:</p>

<p><a href="http://www.sonatype.com/people/?attachment_id=1886" rel="attachment wp-att-1886"><img src="http://www.sonatype.com/people/wp-content/uploads/2009/03/mercury-trre-graph-difference.png" alt="mercury-trre-graph-difference" title="mercury-trre-graph-difference" width="492" height="593" class="aligncenter size-full wp-image-1886" /></a></p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.sonatype.com/people/2009/03/dirty-tree-resolved-tree-resolved-graph/&via=SonatypeCM&text=Dirty Tree - Resolved Tree - Resolved Graph&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2009/03/dirty-tree-resolved-tree-resolved-graph/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven Virtual Versions: Let&#039;s Fix this Mess!</title>
		<link>http://www.sonatype.com/people/2009/03/maven-virtual-versions-lets-fix-this-mess/</link>
		<comments>http://www.sonatype.com/people/2009/03/maven-virtual-versions-lets-fix-this-mess/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 18:35:04 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Mercury]]></category>

		<guid isPermaLink="false">http://www.sonatype.com/people/?p=1767</guid>
		<description><![CDATA[Maven introduced a very useful idea &#8211; &#8220;virtual&#8221; versions: SNAPSHOT, LATEST, RELEASE. While this is an interesting and powerful feature, I&#8217;ve found that people still don&#8217;t have a firm grasp of how virtual version work and of some of the problems with SNAPSHOT versions. Depending on how you use and/or understand it, this feature can [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.sonatype.com/people/wp-content/uploads/2009/01/maven.png" alt="maven" title="maven" width="180" height="77" class="alignright size-full wp-image-1488" />Maven introduced a very useful idea &#8211; &#8220;virtual&#8221; versions: SNAPSHOT, LATEST, RELEASE.    While this is an interesting and powerful feature, I&#8217;ve found that people still don&#8217;t have a firm grasp of how virtual version work and of some of the problems with SNAPSHOT versions.  Depending on how you use and/or understand it, this feature can cut both ways.   In this post, I take a closer look at Maven&#8217;s Virtual Versions and try to provide some clarity and definition.
<span id="more-1767"></span>
In theory, any dependency can specify a virtual version:</p>

<ul>
<li>Modifier  <strong>SNAPSHOT</strong> is a modifier for a &#8220;base&#8221; version. If you specify <em>1.0-SNAPSHOT</em>, this translates to &#8220;give me the latest development version for the base 1.0&#8243;.    The assumption behind the SNAPSHOT modifier is that developers are continuously pumping out version after version in order to get to <em>1.0</em>.   A development team is constantly and repeatedly deploying snapshot into repositories, and others can use them without requesting the exact version.</li>
<li>Version name  <strong>LATEST</strong>.  This is used without a <em>base</em> version and simply means &#8211; find and give me the latest possible version of an artifact be it a SNAPSHOT or a RELEASE.</li>
<li>Version name  <strong>RELEASE</strong> . Same as <strong>LATEST</strong>, but excludes any <strong>SNAPSHOT</strong>  dependencies.</li>
</ul>

<p>The last two are true virtual versions as there is no POM with such version set.  In Maven 2, virtual versions are only used by plugin dependencies, <strong>Mercury</strong> treats them as first class citizens and can process virtual versions anywhere in artifact metadata (with the exception of version range definitions).</p>

<p>SNAPSHOT is a much more convoluted virtual version, and there are a lot of problems and contradictions involved in the resolution of SNAPSHOT dependencies:</p>

<p>The local repository could house both timestamped snapshot binaries and -SNAPSHOT binaries, like  mercury-artifact-1.0-alpha-6-20090305.234653-4.jar and mercury-artifact-1.0-alpha-6-SNAPSHOT.jar. <strong>Let&#8217;s call them timestamped snapshots (TS) and non-timestamped snapshots (SN) respectively</strong> .   While the install plugin does create non-timestamped (SN) binaries, the deploy plugin only creates timestamped snapshots (TS) binaries in the remote repopository.  Remote repositories usually contain only timestamped (TS) snapshots, but I saw several cases where people copied the contents of a local repository to a server and hoped to use it as a remote repository.</p>

<p>The file&#8217;s last modification date on timestamped snapshot (TS ) could be before or after the non-timestamped snapshot (SN), if one exists. And it&#8217;s hard to select a correct version based on either name or modification date.</p>

<p>All these different options prevent consistent processing of virtual versions by repository management code. While LATEST and RELEASE are more or less well defined and allow formal processing, SNAPSHOT leaves a lot to wish for. The above listed scenario&#8217;s don&#8217;t allow a consistent treatment of snapshots. Take for example Mercury &#8211; if it uses a <em>select non-timestamped (SN) artifacts if they exist</em> strategy, there is a good chance that the non-timestamped artifact isn&#8217;t as recent as the timestamped artifact &#8211; leading to possible compilation errors.   On the other hand, if Mercury tries to avoid this situation by looking at file timestamps, one bad file date could wreak havoc.</p>

<p>To summarize &#8211; there is no &#8220;right&#8221; solution, as each approach could be broken easily by primitive and often inevitable repository modifications.  By removing these literal &#8220;SNAPSHOT&#8221; files and requiring all snapshots to be timestamped, we can make the SNAPSHOT virtual version as consistent and reliable as the RELEASE and LATEST virtual version.   Mercury, tries to be as backward-compatible as possible, recreating the already established algorithm for resolving SNAPSHOT dependencies.</p>

<p>The real solution, the way to fix this mess, is to get rid of literal &#8220;SNAPSHOT&#8221; files in the repository altogether.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.sonatype.com/people/2009/03/maven-virtual-versions-lets-fix-this-mess/&via=SonatypeCM&text=Maven Virtual Versions: Let&#039;s Fix this Mess!&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2009/03/maven-virtual-versions-lets-fix-this-mess/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mercury Ant tasks &#8211; HowTo</title>
		<link>http://www.sonatype.com/people/2008/12/mercury-ant-tasks-howto/</link>
		<comments>http://www.sonatype.com/people/2008/12/mercury-ant-tasks-howto/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 01:18:04 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[How-To]]></category>
		<category><![CDATA[m2eclipse]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Mercury]]></category>

		<guid isPermaLink="false">http://blogs.sonatype.com/people/?p=1065</guid>
		<description><![CDATA[mercury-ant-tasks is an Ant wrapper for Mercury functionality, that provides a lot of Mercury functionality inside ant scripts. Please check this posting first. It contains the latest information on the subject. &#60;br/> &#60;br/> What exactly is provided: Configuration named authentication elements to be used by repository or proxy authentication supports both name/password or certificate pointer [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-thumbnail wp-image-995" title="repo-conservation" src="http://blogs.sonatype.com/people/wp-content/uploads/2008/12/mercury-logo.png" alt="Mercury logo" width="150" height="90" />mercury-ant-tasks is an Ant wrapper for Mercury functionality, that provides a lot of Mercury functionality inside ant scripts.
<span id="more-1065"></span></p>

<hr />

<h2>Please check <a href="http://people.apache.org/~ogusakov/sites/mercury-ant/mercury-ant-tasks/howto.html">this posting</a> first. It contains the latest information on the subject.</h2>

<p>&lt;br/>
&lt;br/></p>

<p>What exactly is provided:</p>

<ul>
    <li><strong>Configuration</strong>
<ul>
    <li>named authentication elements to be used by repository or proxy authentication</li>
    <li>supports both name/password or certificate pointer (file or URL) plus optional password</li>
    <li>named repository configurations</li>
    <li>local repositories (not limited to one)</li>
    <li>remote repositories</li>
    <li>stream verification per repository &#8211; separate for reading and writing</li>
    <li>currently supported SHA-1 and PGP (.asc)</li>
</ul>
</li>
    <li><strong>named dependency sets</strong>
<ul>
    <li>lists dependencies and optionally &#8211; their Maven scopes</li>
    <li>standardized on a one-string naming convention</li>
    <li>supports OSGi-syntax version ranges</li>
</ul>
</li>
    <li><strong>ant path creation/alteration</strong>
<ul>
    <li>a task that either creates a new ant path or adds to existing one</li>
    <li>optionally allows to specify Maven-like scope for the path resolution</li>
</ul>
</li>
    <li><strong>repository writes</strong>
<ul>
    <li>allows to write named files into repositories</li>
    <li>optional classifiers, types</li>
    <li>signature generation is configured per repository</li>
    <li>SHA1, PGP</li>
</ul>
</li>
</ul>

<hr />

<h3>Where to get mercury-ant-tasks?</h3>

<p>All the development releases will be deployed to <a href="http://people.apache.org/~ogusakov/repos/test/org/apache/maven/mercury/mercury-ant-tasks/1.0-alpha-1-SNAPSHOT/">this site</a>; grab the latest snapshot and:</p>

<ul>
    <li>put it into ${user.home}/.ant/lib</li>
    <li>if you plan to use PGP signatures &#8211; also put there bcpg-jdk15-140.jar and bcprov-jdk15-140.jar from <a href="http://repo1.maven.org/maven2/bouncycastle/">this central repository location</a></li>
    <li>if interested &#8211; my test <a href="http://people.apache.org/~ogusakov/repos/test/org/apache/maven/mercury/mercury-ant-tasks/1.0-alpha-1-SNAPSHOT/build.xml">build.xml</a> contains all the unit test scripts</li>
</ul>

<hr />

<h3> mercury-ant-tasks howto-by-example</h3>

<p>&nbsp;&nbsp;</p>

<p>This snippet shows how to define mercury namespace in the ant project markup</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;project</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;mercury-ant-test&quot;</span> <span style="color: #000066;">default</span>=<span style="color: #ff0000;">&quot;compile&quot;</span></span>
<span style="color: #009900;"><span style="color: #000066;">xmlns:merc</span>=<span style="color: #ff0000;">&quot;antlib:org.apache.maven.mercury.ant.tasks&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span></span> ... <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/project<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>


<p>&nbsp;&nbsp;</p>

<p>This snippet shows how to define two repositories &#8211; one remote, one local. <strong>You don&#8217;t have to always define a local repository</strong>, but in this case binaries would reside in temp. location and will be reloaded from the remote on each invocation of the merc:resolve task</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:config</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;conf&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:repo</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;localRepo&quot;</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;/maven.repo&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:repo</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;central&quot;</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;http://repo1.maven.org/maven2&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/merc:config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>


<p>&nbsp;&nbsp;</p>

<p>This snippet shows how to define authenticated repository and hide the password in the external file, so that each OS user can have their own credentials</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;~/.secret/secret.properties&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:config</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;conf&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:auth</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;repo-auth&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;${repo.user}&quot;</span> <span style="color: #000066;">pass</span>=<span style="color: #ff0000;">&quot;${repo.pass}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:repo</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;localRepo&quot;</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;/maven.repo&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:repo</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;central&quot;</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;http://repo1.maven.org/maven2&quot;</span></span>
<span style="color: #009900;">             <span style="color: #000066;">authid</span>=<span style="color: #ff0000;">&quot;repo-auth&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/merc:config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>


<p>&nbsp;&nbsp;</p>

<p>This snippet shows how to configure a repository for PGP signature generation and checking; here secret keyring password is also kept in external file. Key ID always is a 16-digit hex number &#8211; use <a href="http://www.gnupg.org/">GnuPG</a> GUI to look it up (and also generate/manipulate your keys). The verifier will accept any key from pubring.gpg for the signature</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;~/.secret/secret.properties&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:config</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;conf&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:auth</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;repo-auth&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;${repo.user}&quot;</span> <span style="color: #000066;">pass</span>=<span style="color: #ff0000;">&quot;${repo.pass}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:repo</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;localRepo&quot;</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;/maven.repo&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:repo</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;central&quot;</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;http://repo1.maven.org/maven2&quot;</span></span>
<span style="color: #009900;">                    <span style="color: #000066;">authid</span>=<span style="color: #ff0000;">&quot;repo-auth&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:verifywrite</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;pgp&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;keyring&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;/home/me/pgp/secring.gpg&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;pass&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${secret.keyring.pass}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;key&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;0EDB5D91141BC4F2&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/merc:verifywrite<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:verifyread</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;pgp&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;keyring&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;/home/me/pgp/pubring.gpg&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/merc:verifyread<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/merc:repo<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/merc:config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>


<p>&nbsp;&nbsp;</p>

<p>This snippet shows how to define authenticated repository and hide the password in the external file, so that each OS user can have their own credentials</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;~/.secret/secret.properties&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:config</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;conf&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:auth</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;repo-auth&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;${repo.user}&quot;</span> <span style="color: #000066;">pass</span>=<span style="color: #ff0000;">&quot;${repo.pass}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:repo</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;localRepo&quot;</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;/maven.repo&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:repo</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;central&quot;</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;http://repo1.maven.org/maven2&quot;</span></span>
<span style="color: #009900;">                    <span style="color: #000066;">authid</span>=<span style="color: #ff0000;">&quot;repo-auth&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/merc:config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>


<p>&nbsp;&nbsp;</p>

<p>This snippet shows how to define a dependency set. Junit will only be added to paths that define scope=&#8221;test&#8221;</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;my-libs&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:dependency</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;asm:asm:[2.0,3.0)&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:dependency</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;junit:junit:[4.0.1,):::test&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/merc:dep<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>


<p>&nbsp;&nbsp;</p>

<p>This snippet shows how to resolve a dependency set and add the resulting binaries to &#8220;compile-path&#8221; path. This path will not include JUnit from previous snippet</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:resolve</span> <span style="color: #000066;">pathid</span>=<span style="color: #ff0000;">&quot;compile-path&quot;</span> <span style="color: #000066;">depid</span>=<span style="color: #ff0000;">&quot;my-libs&quot;</span> <span style="color: #000066;">configid</span>=<span style="color: #ff0000;">&quot;conf&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;javac</span> <span style="color: #000066;">srcdir</span>=<span style="color: #ff0000;">&quot;${src}&quot;</span> <span style="color: #000066;">destdir</span>=<span style="color: #ff0000;">&quot;${target}&quot;</span> <span style="color: #000066;">classpathref</span>=<span style="color: #ff0000;">&quot;compile-path&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>


<p>&nbsp;&nbsp;</p>

<p>This snippet shows how to resolve a dependency set in test scope and add the resulting binaries to &#8220;test-compile-path&#8221; path. This path will have JUnit</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:resolve</span> <span style="color: #000066;">pathid</span>=<span style="color: #ff0000;">&quot;test-compile-path&quot;</span></span>
<span style="color: #009900;">                      <span style="color: #000066;">depid</span>=<span style="color: #ff0000;">&quot;my-libs&quot;</span></span>
<span style="color: #009900;">                      <span style="color: #000066;">configid</span>=<span style="color: #ff0000;">&quot;conf&quot;</span></span>
<span style="color: #009900;">                      <span style="color: #000066;">scope</span>=<span style="color: #ff0000;">&quot;test&quot;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>


<p>&nbsp;&nbsp;</p>

<p>This snippet shows how to write a jar file and it&#8217;s sources to a repository</p>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:write</span> <span style="color: #000066;">repoid</span>=<span style="color: #ff0000;">&quot;remoteRepo&quot;</span></span>
<span style="color: #009900;">                   <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;t:t:1.0&quot;</span></span>
<span style="color: #009900;">                   <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${basedir}/target/t.jar&quot;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;merc:write</span> <span style="color: #000066;">repoid</span>=<span style="color: #ff0000;">&quot;remoteRepo&quot;</span></span>
<span style="color: #009900;">                   <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;t:t:1.0:sources&quot;</span></span>
<span style="color: #009900;">                   <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${basedir}/target/t-src.jar&quot;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>


<p>&nbsp;</p>

<hr/>

<p>&nbsp;</p>

<h3>mercury-ant-tasks reference</h3>

<p>Now, let&#8217;s have a closer look at ant mercury markup. To make it available to ant, provide a namespace definition on the project level, for example:
<code>&lt;project name="test" default="compile" xmlns:merc="antlib:org.apache.maven.mercury.ant.tasks"&gt;</code></p>

<p>Everywhere here I mention <em>named</em> &#8211; named configuration, named set. It means named in ant sense: something that has an <em>id</em> attribute value, and then we can reference that particular object (configuration, set, etc) by this value.</p>

<table border="0" style="width: 600px; border: 1px solid black; padding: 5px;">
<tbody style="width: 600px;">
<tr>
<th>Tag</th>
<th>Attribute<br/>(<b>required</b>)</th>
<th>Description</th>
</tr>
<tr bgcolor="#f6f6f6">
<td>merk:config</td>
<td></td>
<td>defines a named configuration, for now it&#8217;s just a set of named repositories and authentications</td>
</tr>
<tr>
<td></td>
<td><b>id</b></td>
<td>the name of this configuration</td>
</tr>
<tr bgcolor="#f6f6f6">
<td>merc:auth</td>
<td></td>
<td>defines a named authentication</td>
</tr>
<tr>
<td></td>
<td><b>id</b></td>
<td>name of this authentication</td>
</tr>
<tr>
<td></td>
<td>user</td>
<td>user name to use in this authentication</td>
</tr>
<tr>
<td></td>
<td>certfile</td>
<td>a pointer to certificate file or URL. Can take a form of just a file pointer, or URL: file:///home/me/certificate. Or regular URL http://my.site.com/certificates/file. <strong>Note:</strong> currently SSL client does not support client certificates</td>
</tr>
<tr>
<td></td>
<td>pass</td>
<td>password to use with either user or certificate</td>
</tr>
<tr bgcolor="#f6f6f6">
<td>merc:repo</td>
<td></td>
<td>defines a named repository that may contain dependencies. <strong>It can only reside inside merc:config element</strong></td>
</tr>
<tr>
<td></td>
<td><b>id</b></td>
<td>defines a unique id for this repository. Use consistent IDs as the are used by cache to speed up access to repository metadata</td>
</tr>
<tr>
<td></td>
<td>type</td>
<td>repository type, used internally to find repository implementation. Default is M2 repository implementations from Mercury <b>(default: &#8220;m2&#8243;)</b></td>
</tr>
<tr>
<td></td>
<td>dir</td>
<td>defines a local repository. Point to the root of the local repository directory</td>
</tr>
<tr>
<td></td>
<td>url</td>
<td>defines a remote repository and contains it&#8217;s URL</td>
</tr>
<tr>
<td></td>
<td>authid</td>
<td>contains a reference to the <em>merc:auth</em> element that defines how to access authenticated repository</td>
</tr>
<tr>
<td></td>
<td>proxyauthid</td>
<td>contains a reference to the <em>merc:auth</em> element that defines how to access authenticated proxy for a repository</td>
</tr>
<tr>
<td></td>
<td>readable</td>
<td>boolean, defines this repository as suitable for reading from it</td>
</tr>
<tr>
<td></td>
<td>writeable</td>
<td>boolean, defines this repository as suitable for writing to it</td>
</tr>
<tr bgcolor="#f6f6f6">
<td>merc:verifyread</td>
<td></td>
<td>defines a read verification configuration.<strong>It can only reside inside merc:repo element</strong></td>
</tr>
<tr>
<td></td>
<td><b>type</b></td>
<td>define the verification algo to use. Supported today are <strong>pgp</strong> and <strong>sha1</strong></td>
</tr>
<tr>
<td></td>
<td>lenient</td>
<td>boolean, if set to true &#8211; verification failure does not stop the repository operation <b>(default: true)</b></td>
</tr>
<tr>
<td></td>
<td>sufficient</td>
<td>boolean, if set to true and there are multiple verificators &#8211; success of this verification stops all others <b>(default: false)</b></td>
</tr>
<tr bgcolor="#f6f6f6">
<td>merc:verifyread</td>
<td></td>
<td>defines a read verification configuration.<strong>It can only reside inside merc:repo element</strong></td>
</tr>
<tr>
<td></td>
<td><b>type</b></td>
<td>define the verification algo to use. Supported today are <strong>pgp</strong> and <strong>sha1</strong></td>
</tr>
<tr>
<td></td>
<td>lenient</td>
<td>boolean, if set to true &#8211; verification failure does not stop the repository operation <b>(default: true)</b></td>
</tr>
<tr>
<td></td>
<td>sufficient</td>
<td>boolean, if set to true and there are multiple verificators &#8211; success of this verification stops all others <b>(default: false)</b></td>
</tr>
<tr bgcolor="#f6f6f6">
<td>merc:deps</td>
<td></td>
<td>defines a named set of dependencies</td>
</tr>
<tr>
<td></td>
<td><b>id</b></td>
<td>the name of this set</td>
</tr>
<tr bgcolor="#f6f6f6">
<td>merc:dependency</td>
<td></td>
<td>a path element query, that could be resolved by <strong>merc:resolve</strong> task</td>
</tr>
<tr>
<td></td>
<td><b>name</b></td>
<td>a query in the format <strong>groupId:artifactId:versionRange:classifier:type:scope</strong>, required are only the first 3 fields, the rest can be omitted. Examples: <strong>ant:ant:1.7.0</strong> &#8211; search for this dependency, <strong>ant:ant:[1.7.0,)</strong> - search for any version, greater or eq. to 1.7.0, <strong>ant:ant:[1.7.0,)::test</strong> - search for these version and resolve them in the test scope (see merc:resolve), <strong>ant:ant:[1.7.0,1.7.1]</strong> &#8211; search for ant versions between 1.7.0 and 1.7.1 inclusive, <strong>my.apps:app:1.1::zip</strong> &#8211; find and store locally my.app/app/app-1.1.zip</td>
</tr>
<tr bgcolor="#f6f6f6">
<td>merc:resolve</td>
<td></td>
<td>ant path manipulation: create new path or append to the existing path</td>
</tr>
<tr>
<td></td>
<td><b>depid</b></td>

<td>id of the dependency set that should be resolved and added to the path</td>
</tr>
<tr>
<td></td>
<td><b>configid</b></td>
<td>id of the configuration to be used by this resolution</td>
</tr>
<tr>
<td></td>
<td>pathid</td>
<td>id of the newly created path. This path should not have been previously defined</td>
</tr>
<tr>
<td></td>
<td>refpathid</td>
<td>id of the existing path. This path should already exist</td>
</tr>
<tr>
<td></td>
<td>scope</td>
<td>scope, for which this path should be resolved. <b>(default: compile)</b></td>
</tr>
<tr bgcolor="#f6f6f6">
<td>merc:write</td>
<td></td>
<td>this task writes a file to the specified repository under specified name</td>
</tr>
<tr>
<td></td>
<td><b>repoid</b></td>
<td>id of the repository to write this file into</td>
</tr>
<tr>
<td></td>
<td>name</td>
<td>repository name of the atrifact to write to the repository (see dependency name desc., exclude ranges)</td>
</tr>
<tr>
<td></td>
<td>pom</td>
<td>pom file to use instead of the name attribute</td>
</tr>
<tr>
<td></td>
<td><b>file</b></td>
<td>file to be written to the repository</td>
<td></td>
</tr>
</tbody>
</table>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.sonatype.com/people/2008/12/mercury-ant-tasks-howto/&via=SonatypeCM&text=Mercury Ant tasks - HowTo&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2008/12/mercury-ant-tasks-howto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dependency Resolution as a Diagram</title>
		<link>http://www.sonatype.com/people/2008/12/dependency-resolution-as-a-diagram/</link>
		<comments>http://www.sonatype.com/people/2008/12/dependency-resolution-as-a-diagram/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 00:40:03 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Mercury]]></category>

		<guid isPermaLink="false">http://blogs.sonatype.com/people/?p=1016</guid>
		<description><![CDATA[They say that one picture is worth a thousand words, so I shut up: Tweet]]></description>
			<content:encoded><![CDATA[<p>They say that one picture is worth a thousand words, so I shut up:</p>

<p><img src="http://blogs.sonatype.com/people/wp-content/uploads/2008/12/sat4.png" alt="" title="sat" width="500" height="1480" class="aligncenter size-full wp-image-1028" /></p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.sonatype.com/people/2008/12/dependency-resolution-as-a-diagram/&via=SonatypeCM&text=Dependency Resolution as a Diagram&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2008/12/dependency-resolution-as-a-diagram/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is Mercury?</title>
		<link>http://www.sonatype.com/people/2008/11/what-is-mercury/</link>
		<comments>http://www.sonatype.com/people/2008/11/what-is-mercury/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 16:42:31 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Mercury]]></category>

		<guid isPermaLink="false">http://blogs.sonatype.com/people/?p=1262</guid>
		<description><![CDATA[Mercury is a serious attempt to: Decouple major Maven components, making them available as stand-alone building blocks rather then having Maven as as one big monolith, not usable outside of its environment. Artifact &#8211; clearly separate an Artifact from its metadata. Repository &#8211; convert a repository into active component. It used to give back just [...]]]></description>
			<content:encoded><![CDATA[<p>Mercury is a serious attempt to:</p>

<ul>
<li>Decouple major Maven components, making them available as stand-alone building blocks rather then having Maven as as one big monolith, not usable outside of its environment.</li>
<li><strong>Artifact</strong> &#8211; clearly separate an Artifact from its metadata.</li>
<li><strong>Repository</strong> &#8211; convert a repository into active component. It used to give back just pathOf(), now it accepts GAV collections and gives back either metadata or full blown Artifacts.</li>
<li><strong>Transport</strong> &#8211; an API in development.</li>
<li><strong>DependencyTreeBuilder</strong> main API for dependency graph creation and conflict resolution.</li>
<li>Decouple container, so that these components are just plain pojos.</li>
<li>Introduce <strong>Jetty</strong>-based HTTP/HTTPS and WebDAV transactional transport layer.</li>
<li>Asynchronous downloads and uploads. One of the few successful usages of Java NIO in OSS.</li>
<li>Transactional operations &#8211; all-or-nothing for file sets.</li>
<li>Move integrity control into transport layer, upper level components should not care about these details.</li>
<li>Abstract out metadata cache, provide at least one implementation there.</li>
<li>Integrate these changes back to Maven 3.x to make it even better platform than it is right now (if it is possible to be better <img src='http://www.sonatype.com/people/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</li>
</ul>

<p>Currently Mercury can already be used for accessing repositories, and conflict resolution is under testing.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.sonatype.com/people/2008/11/what-is-mercury/&via=SonatypeCM&text=What is Mercury?&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2008/11/what-is-mercury/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mercury event framework design notes</title>
		<link>http://www.sonatype.com/people/2008/11/mercury-events-framework-design-notes/</link>
		<comments>http://www.sonatype.com/people/2008/11/mercury-events-framework-design-notes/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 03:27:17 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[Mercury]]></category>

		<guid isPermaLink="false">http://blogs.sonatype.com/people/oleg/?p=71</guid>
		<description><![CDATA[For a long time I&#8217;ve been perplexed by what is going inside Maven, what&#8217;s there under the hood. Later I started learning the code and it gave me some perspective. Then I wrote a chunk of code &#8211; Mercury, but the exact understanding of what is happening inside is still hard to grasp: the code [...]]]></description>
			<content:encoded><![CDATA[<p>For a long time I&#8217;ve been perplexed by what is going inside Maven, what&#8217;s there under the hood. Later I started learning the code and it gave me some perspective. Then I wrote a chunk of code &#8211; Mercury, but the exact understanding of what is happening inside is still hard to grasp: the code base is rather big and logic rather complex for a human mind to follow all the details.</p>

<p>All that, plus the necessity to provide tool integration, led to the idea to introduce an event framework into Mercury. All major processing object implement EventGenerator interface, that allows client code to register MercuryEventListener implementations and unRegister them as well.<span id="more-859"></span></p>

<p><strong>MercuryEvent</strong> in itself has</p>

<ul>
<li>local TZ based start timestamp</li>
<li>long duration in millis</li>
<li>enumeration based type, which is also used for event partitioning</li>
<li>name &#8211; obviously to identify this event</li>
<li>tag to record lightweight information about event</li>
<li>result to record the outcome of the event</li>
<li>Map based payload &#8211; for tool integration to get access to typed objects, event wants to carry to the tool</li>
</ul>

<p>Client code has several options to play with:</p>

<ul>
<li>event listener can declare a BitSet based mask of event types it wants to be notified about</li>
<li>event manager could be configured with a mask of event types it will propagate</li>
<li>there is a system property to define which event types should be propagated by the event manager, if one is created by the client code</li>
</ul>

<p>The event manager itself separates event dispatching from event generator code via a thread pool, so that events are only placed into an event queue in the event generator thread, and then are sent out to listeners in parallel to the main code.</p>

<p>There is also a <strong>DumbListener</strong>, implemented to just peek at the events &#8211; prints them out to system.out or any other output stream.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.sonatype.com/people/2008/11/mercury-events-framework-design-notes/&via=SonatypeCM&text=Mercury event framework design notes&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.sonatype.com/people/2008/11/mercury-events-framework-design-notes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

