Good Review of Nexus / Comparison to Artifactory

James Williams blogged a quick comparison of Artifactory to Nexus. He leans toward Nexus, and his post provides a good feature comparison between the two repository managers. Competition is great, and Sonatype really does see the presence of other strong repository managers as a sign of a healthy community. We believe that Nexus is the best option out there, and it is nice to see people notice all the hard work this team has put into making a solid repository manager.
Read his evaluation and comparison here: http://cfossguy.blogspot.com/2008/09/my-artifactory-versus-nexus-experience.html
Apache Maven 2.1.0-M1 Released!
Yesterday evening, the Apache Maven project announced the first milestone release of the 2.1.0 (2.1.0-M1 is the actual version name). I highly recommend downloading your copy today, from the Apache Maven website.
This release is the culmination of development work going back beyond last May, and a release process that produced its first release candidate (RC) build for testing on July 18, two months to the day before I was finally able to push the 2.1.0-M1 binaries out to the download page, and announce the release publicly. In that time, the code has undergone some important revision to make it faster and more stable. Looking back, there are some interesting statistics associated with this release, mainly because they highlight a marked difference between the two most recent Maven releases – 2.1.0-M1 and 2.0.9 – and all those that came before. Here are a few of those statistics.
When we started the release process on July 18, we had 41 issues assigned to that Fix-For version in JIRA; when I sent out the announcement to the mailing lists last night, we had closed 70 issues. That’s 29 issues that came up during the release-testing process, and were debugged, tested, and resolved, leaving the code more stable than it had been previously. Since July 18, I’ve personally pushed out 17 release candidates, with an average of 1.71 (we’ll call it 2) issues fixed per RC, and about 3.5 days in between RCs on average.
We’re all very excited about this release, and I’m very confident that this will be the most stable version of Maven you’ve used to date. Please give it a shot; you’ll be sorry if you don’t!
Now, for anyone interested in why this release is called ’2.1.0-M1′ and not ’2.0.10′, please read below the fold:
The release of version 2.1.0-M1 marks an important shift in the development strategy here at Maven. Not only is this the second release with an extensive release-testing phase beforehand – which is vastly improving the stability of our releases, for obvious reasons – but it’s also the first release of Maven to (formally) move beyond the tight constraints of the 2.0.x version series. Previously, Maven was locked into a sort of dual development mode, where only the lowest-risk bugfixes were introduced to the 2.0.x series, and almost all new development was happening on what we were calling the 2.1 or trunk code. With this release, our development strategy has changed. Now, Maven’s development strategy centers on three main goals: regression fixes for the 2.0.x code; low-risk, formally planned features and implementation improvements for the 2.1, 2.2, ..2.x code; and more aggressive subsystem redesign and reimplementation efforts going on in the 3.x code.
There’s a danger of getting into a confusing version-soup scenario here, but I’d like to briefly explain the purpose of each development effort. First, with the 2.0.x version series, we’re planning to do only regression fixes and put it into end-of-life mode soon. We’re starting to run into issues where fixing one regression causes another, and the only good way out involves taking on quite a bit of extra implementation risk…and possibly jeopardizing what stability we have. This is actually why the most recent release is 2.1.0-M1, not 2.0.10 (which is what it started out to be). During the course of fixing issues for the release, we began to recognize the need for some relatively large, risky changes in order to avoid the aforementioned contradictory regression problem. Yet we realized that these code fixes were simply too aggressive for a 2.0.x release, and carried with them more risk for instability (because of the quantity of new code) than we were willing to introduce for 2.0.10.
For this purpose, we have decided to rename the old 2.1/trunk code to 3.x, to make room for a new, intermediary version series. At this point, the 3.x code had already undergone some really significant changes related to embedding, project building, plugin loading, and more. Therefore, these intermediary versions were meant to provide stepping stones for the users, between 2.0.x and 3.x, where new features and reimplementations could be introduced gradually. As part of this effort, we’re creating release plans for each minor version release, which will be backed up by design documents and JIRA issues (for tracking in release notes). Each major introduction will constitute a milestone in the release cycle, with the run-up to the final release being another of the release-testing processes that we’ve just been through.
For more information on the release plans we’re currently working on, see the Maven 2.x page on Codehaus Confluence.
Reading through the archives of the Maven mailing lists, you’ll no doubt come across mention of the by-now-mythical Maven 2.1; these discussions pertain to what is now Maven 3.x, which as I speak is shoring up nicely for a push to its own first milestone release. This code forms the basis of the IDE integration you’re probably using, possibly through Eclipse, via the m2eclipse project or Netbeans, via the Mevenide project. I’m sure this version switch will create a certain amount of confusion, but I’m also sure that all will become clear when the releases start rolling out.
It’s an exciting time here at Apache Maven. Keep an eye on the project, and I think you’ll see some unprecedented progress over the next few months.
Maven does not dictate structure. Maven promotes it!
This is my response a comment on TSS about the structure in Maven projects. We recommend a structure we don’t dictate one …
The directory structure used by a Maven project has never been fixed. There are defaults, yes, but they can all be overridden. I have had many clients over the years that have had existing structures that needed to be preserved for various policy reasons, or projects that had lives spanning many branches into the past where changing the directory structure would have made merging a nightmare. The defaults are easy to change at a project, or organizational level. That the structure is fixed in Maven is a myth.
Many organizations choose to start new projects using the standard structure and/or migrate to the standard where possible as standard Maven documentation, training, and idioms then apply. Maven’s defaults were chosen to allow for growth but are, in fact, as arbitrary as the defaults in any other system. The advantage is that our defaults are used by a few hundred thousand people and there are undeniable benefits in a collective understanding of a project structure. I’m not trying to say this alone mitigates any of the implementation defects in Maven (of which no one is more acutely aware then myself) or that a default structure alone is a good reason to use Maven. But it lends itself toward building a level of social capital (a measure of how well groups can work together) because there is some common structure from which to work from and communicate. Maven does not dictate a structure, contrary to popular opinion, but we definitely promote one.
You have used your same Ant build files since 2002 which works for you. If you deliver using this tool set who can argue with that. But I have seen the argument many times over and it goes something like “my structure is pretty simple because I stick to the basics and it does what I need.” This is perfectly fine in isolated cases but try to onboard new developers, find resources for your build and release team, attract developers to your open source project, reach a standard in your department, or your organization, integrate with disparate parts of your organization, incorporate third party libraries, integrate open source and you will rapidly find N pivot points against which you must learn something different to make the overall system work. This is simply an untenable proposition for a community of people trying to together efficiently.
Maven has many flaws, but it is very usable by a large number of groups. Maven is also not static. Not many people know that .NET and C toolchains have been created for Maven, or that with a few new implementations of internal components that Maven can build OSGi components directly from manifest information (look Mom, no POM!), or that you can write Maven plugins in Groovy, Ruby, or Ant script. Many of these things are unknown because the Maven project has admittedly been terrible at documenting these attributes and features. This is a failure at the Maven community level that we are trying address.
Ultimately it’s your decision as a user. If Maven doesn’t work for you don’t use it. But Maven was not meant to cater to personal biases, it was meant to work for groups and as such compromises need to be made in order to use Maven effectively. Maven is not for anyone in particular, it was intended for a large number of users who have made a conscious decision to work in more or less in the same way to achieve results in what they are making, not in how they make it.
Atlassian, you should try Nexus
I was researching an indexing bug we’ve been having with Confluence when I came across this FAQ entry:
Maven complains it is “Unable to download the artifact from any repository.”
We use Maven project’s Archiva Maven Proxy to act as our Maven repository. Sometime, however, artifact downloads fail because of Archiva’s instabilities. If you run into messages like this, sometimes a second attempt will succeed in dowbloading the artifact. If it doesn’t work after a few times, then the artifact may be truly missing. You can search our Archiva to confirm this.
So if it doesn’t work, just try it again. Kinda reminds me of this skit.
Update: Apparently this is still an ongoing issue.
Atlassian, maybe you should try Nexus instead. See what our users are saying:
“the maven repository that’s a dream to install and use” “Sonatype new nexus maven2 repo manager is looking very good” “Finally, a Maven Repository Manager that works! “Sonatype‘s Nexus makes local Maven repositories easy” “get a proxy in place. Have been using sonatype nexus and it does a very good job” “Considering Nexus instead of Archiva for a Maven Repo. Nexus doesn’t need a db. (It’s lucene + filesystem)” “man nexus needs to be installed by default for anyone using maven”
Maven users rebel against MyEclipse
Sometimes Maven takes heat for being “opinionated” and wanting you to do things a certain way. Even though it is usually configurable, it’s normally easier to go with the flow.
It seems that the “Maven Way” is catching on, as masses of Maven users rebel against MyEclipse’s attempt at using M2Eclipse as the basis for their Maven integration. In the beginning it sounded like a good thing, using the best plugin as a base to provide integration to more users. The trouble is that this implementation changed some core functionality and only supports new projects. Worse is that existing M2e users get tripped up by the incompatibility with the Maven4Eclipse implementation.
A key tenet of Maven is that all Maven based projects behave the same regardless of where they are. Once you know Maven, you should be able to work with any Maven project in seconds. It seems that MyEclipse broke this tenet and the users aren’t too happy about it.
A more appropriate approach would be to work with M2e to add features instead of effectively forking it.
You can read more about it on Jason’s blog.