Upgrading to Maven 3
Join the DZone community and get the full member experience.
Join For FreeI've been playing around with maven 3 lately on our legacy maven 2 multi-module project via mvnsh.
Like advertised, maven 3 is backwards compatible with maven 2. In fact,
most everything worked out of the box when switching to maven 3. In
this post, I'm going to highlight the required and currently optional
items I changed so you can start preparing to migrate your project to
maven 3. But first, what's so special about maven 3 and why would you
upgrade? Polyglot maven, mvnsh, and improved performance (50%-400% faster) are just a few. And since it's so easy to migrate to maven 3, you really don't have any excuses.
Currently, I build our project using maven 2.2.1. This article was
tested with mvnsh 0.10 which includes maven 3.0-alpha-6. The current
release of maven 3 is 3.0-beta-1, while maven 3.1 is due out Q1 of 2011.
Profiles.xml no longer supported
I haven't really figured out the reasoning, but it doesn't really
matter; maven 3.0 no longer supports a profiles.xml. Instead you place
your profiles in your ~/.m2/settings.xml. Some of our database processes
and integration tests require properties from our profiles.xml. It was
simple to solve by just moving my profiles to my settings.xml and
everything worked.
Upgrade GMaven Plugin
We depend pretty heavily on the gmaven plugin
for testing, simple groovy scripts, and some ant calls. In order to
build some modules I had to upgrade gmaven. The current version we were
using was 1.0-rc-3. Our projects built perfectly after changing it to
org.codehaus.gmaven:gmaven-plugin:1.2.
${pom.version} changing to ${project.version}
Here maven 3 kindly warned me that uses of the maven property
pom.version may no longer be supported in future versions and should be
changed to project.version. My modules still built, but thought it was
nice of maven to inform me of the potential change.
Version and Scope Issues
We had a few places where we needed to define a dependency version and
another place where we shouldn't have defined a scope. Both instances
prevented maven 3.0 from building our modules, but fixing them was easy.
The first instance was we defined a version for a plugin in the
pluginManagement section, but maven 3 required it also where it was used
in the reporting plugin section. Not exactly sure about this one,
ideally you would only define your plugin versions in the
pluginManagement section but oh well.
We had some WAR projects using jetty. In the jetty plugin definition we
had a dependency on geronimo and had defined a scope of provided. Maven 3
complained about it and since it's really not necessary, just removing
it fixed the issue.
modelVersion
Maven 3.0 kept warning about using ${modelVersion} instead of
${project.modelVersion}. I was still able to build though, so my guess
is the value for modelVersion, 4.0.0, most likely will change when maven
3.1 comes out.
Weird Surefire Output
This wasn't necessarily an issue with the surefire plugin, but I wanted
to comment about it's output when tests failed as I thought it might
have been a maven 3 issue. Below is a screenshot of the output when you
have failed tests. At first I thought it was a maven 3 issue, but I
built the same project using the same commands with maven 2.2.1 and got
the same test failures. Hopefully, they can clean this type of thing up,
because I could image lots of people getting confused.
![]() |
Failed test output |
That's essentially it. Happily, there really wasn't much required to change, which goes to show the great lengths the maven team has gone through to ensure backwards compatibility. Finally, here is a Compatibility Notes maven has provided on the subject of migrating maven 2 projects to maven 3.
From http://jlorenzen.blogspot.com/2010/07/upgrading-to-maven-3.html
Opinions expressed by DZone contributors are their own.
Comments