maven2.0.4からmaven2.0.5にバージョンアップする時の注意点

transitive dependency(推移的な依存関係)の解決に修正が加えられている。maven2.0.5ではpomへの記述順で依存性が解決されるようになった。(maven2.0.4ではpomへの記述順ではなかった理由は本来LinkedHashSetを使用すべき箇所でHashSetを使っていたため。)

具体的な変更箇所は

svn diff https://svn.apache.org/repos/asf/maven/components/trunk@430572 https://svn.apache.org/repos/asf/maven/components/trunk@430573

で取得可能で、r430573のコメントが「Merging fix for loss of dependency ordering from branch.」だそうで。

Index: maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java
===================================================================
--- maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java	(revision 430572)
+++ maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java	(revision 430573)
@@ -566,6 +566,7 @@
         }
 
         embedder = new Embedder();
+        
         if ( logger != null )
         {
             embedder.setLoggerManager( new MavenEmbedderLoggerManager( new PlexusLoggerAdapter( logger ) ) );
Index: maven-core/src/main/java/org/apache/maven/DefaultMaven.java
===================================================================
--- maven-core/src/main/java/org/apache/maven/DefaultMaven.java	(revision 430572)
+++ maven-core/src/main/java/org/apache/maven/DefaultMaven.java	(revision 430573)
@@ -58,6 +58,7 @@
 import org.codehaus.plexus.context.Context;
 import org.codehaus.plexus.context.ContextException;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.logging.AbstractLogger;
 import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.logging.LoggerManager;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
@@ -141,15 +142,25 @@
             request.setLocalRepository( mavenTools.createLocalRepository( request.getLocalRepositoryPath() ) );
         }
 
-        Logger logger = loggerManager.getLoggerForComponent( Mojo.ROLE );
+        // FIXME: This will not touch the core maven logger, since it's already been initialized for
+        // this component.
+        loggerManager.setThreshold( request.getLoggingLevel() );
+        
+        Logger myLogger = getLogger();
+        
+        // TODO: When the above problem is fixed, remove this.
+        if ( myLogger instanceof AbstractLogger )
+        {
+            ((AbstractLogger) myLogger).setThreshold( request.getLoggingLevel() );
+        }
 
+        Logger mojoLogger = loggerManager.getLoggerForComponent( Mojo.ROLE );
+
         if ( request.isDefaultEventMonitorActive() )
         {
-            request.addEventMonitor( new DefaultEventMonitor( logger ) );
+            request.addEventMonitor( new DefaultEventMonitor( mojoLogger ) );
         }
 
-        loggerManager.setThreshold( request.getLoggingLevel() );
-
         request.setStartTime( new Date() );
 
         wagonManager.setInteractive( request.isInteractive() );
Index: maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java
===================================================================
--- maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java	(revision 430572)
+++ maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java	(revision 430573)
@@ -32,6 +32,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -243,7 +244,7 @@
 
     private void assembleDependencyInheritance( Model child, Model parent )
     {
-        Map depsMap = new HashMap();
+        Map depsMap = new LinkedHashMap();
 
         List deps = parent.getDependencies();
 
Index: maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
===================================================================
--- maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java	(revision 430572)
+++ maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java	(revision 430573)
@@ -50,6 +50,7 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -302,7 +303,7 @@
                                        ArtifactFilter dependencyFilter, MavenProject project )
         throws InvalidDependencyVersionException
     {
-        Set projectArtifacts = new HashSet( dependencies.size() );
+        Set projectArtifacts = new LinkedHashSet( dependencies.size() );
 
         for ( Iterator i = dependencies.iterator(); i.hasNext(); )
         {

なぜ注意が必要かというと、依存性解決の優先順位が同じでバージョンが異なるjarファイルは、先に依存性解決したほうが優先されるので、場合によっては依存するjarのバージョンが変わってしまうものが出るからです。というか実際に出ました…。結構気づきにくい落とし穴だと思う…。