Index: src/test/java/org/apache/maven/plugin/DefaultPluginRealmManagerTest.java =================================================================== --- src/test/java/org/apache/maven/plugin/DefaultPluginRealmManagerTest.java (wersja 0) +++ src/test/java/org/apache/maven/plugin/DefaultPluginRealmManagerTest.java (wersja 0) @@ -0,0 +1,130 @@ +package org.apache.maven.plugin; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.factory.ArtifactFactory; +import org.codehaus.plexus.PlexusTestCase; + +public class DefaultPluginRealmManagerTest + extends PlexusTestCase +{ + public void testCreateComponent() + throws Exception + { + assertNotNull( "Cannot lookup component: " + PluginRealmManager.ROLE, lookup( PluginRealmManager.ROLE ) ); + } + + public void testGenerateJarsListForArtifactsEmpty() + throws Exception + { + DefaultPluginRealmManager defaultPluginRealmManager = new DefaultPluginRealmManager(); + + assertEquals( "List of jars generated by empty set should be empty", 0, + defaultPluginRealmManager.generateJarsListForArtifacts( Collections.EMPTY_SET ).size() ); + } + + public void testGenerateJarsListForArtifacts() + throws Exception + { + DefaultPluginRealmManager defaultPluginRealmManager = new DefaultPluginRealmManager(); + + /*Different artifactId*/ + List/* */result = + defaultPluginRealmManager.generateJarsListForArtifacts( createArtifactSet( HashSet.class, 5 ) ); + checkListOfNumeredFiles( 5, result ); + + /*Different groups*/ + result = + defaultPluginRealmManager.generateJarsListForArtifacts( createArtifactSetGroups( HashSet.class, 6 ) ); + checkListOfNumeredFiles( 6, result ); + + /*Different versions*/ + result = + defaultPluginRealmManager.generateJarsListForArtifacts( createArtifactSetVersions( HashSet.class, 4 ) ); + checkListOfNumeredFiles( 4, result ); + } + + public void testGetHashOfArtifacts() throws Exception + { + assertEquals("Hash code of empty set should be always the same", DefaultPluginRealmManager.getHashOfArtifacts( Collections.EMPTY_SET), DefaultPluginRealmManager.getHashOfArtifacts( Collections.EMPTY_SET)); + assertEquals("Hash code should be the same for the same content of artifacts list",DefaultPluginRealmManager.getHashOfArtifacts(createArtifactSet(HashSet.class,5)),DefaultPluginRealmManager.getHashOfArtifacts(createArtifactSet(HashSet.class,5))); + assertEquals("Hash code should not depend on set implementation",DefaultPluginRealmManager.getHashOfArtifacts(createArtifactSet(HashSet.class,5)),DefaultPluginRealmManager.getHashOfArtifacts(createArtifactSet(TreeSet.class,5))); + + assertTrue( "Hash should be different for different content", DefaultPluginRealmManager.getHashOfArtifacts(createArtifactSet(HashSet.class,5))!=DefaultPluginRealmManager.getHashOfArtifacts(createArtifactSet(TreeSet.class,6))); + } + + + // =========================== Helpers ==================================================== + + private void checkListOfNumeredFiles( int count, List/* */result ) + throws MalformedURLException + { + assertEquals( "Unexpected size of created urls list: ", count, result.size() ); + for ( int i = 0; i < count; i++ ) + { + File expectedFile = createNumberedFile( i ); + assertTrue( "Expected url not found: " + expectedFile + " in: " + result, result.contains( expectedFile ) ); + } + } + + protected Artifact createArtifact( String groupId, String artifactId, String version ) + throws Exception + { + ArtifactFactory artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE ); + + // TODO: used to be SCOPE_COMPILE, check + return artifactFactory.createBuildArtifact( groupId, artifactId, version, "jar" ); + } + + protected Set/* */createArtifactSet( Class/* */setClass, int count ) + throws Exception + { + Set/* */artifactSet = (Set) setClass.newInstance(); + for ( int i = 0; i < count; i++ ) + { + Artifact artifact = createArtifact( "testGroup", "testArtifact_" + i, "1.0" ); + artifact.setFile( createNumberedFile( i ) ); + artifactSet.add( artifact ); + } + return artifactSet; + } + + protected Set/* */createArtifactSetVersions( Class/* */setClass, int count ) + throws Exception + { + Set/* */artifactSet = (Set) setClass.newInstance(); + for ( int i = 0; i < count; i++ ) + { + Artifact artifact = createArtifact( "testGroup", "testArtifact", i + ".0" ); + artifact.setFile( createNumberedFile( i ) ); + artifactSet.add( artifact ); + } + return artifactSet; + } + + protected Set/* */createArtifactSetGroups( Class/* */setClass, int count ) + throws Exception + { + Set/* */artifactSet = (Set) setClass.newInstance(); + for ( int i = 0; i < count; i++ ) + { + Artifact artifact = createArtifact( "testGroup" + i, "testArtifact_", "1.0" ); + artifact.setFile( createNumberedFile( i ) ); + artifactSet.add( artifact ); + } + return artifactSet; + } + + protected File createNumberedFile( int i ) + { + return new File( "/not_existing_file_" + i + ".jar" ); + } +} Zmiany atrybutów dla: src/test/java/org/apache/maven/plugin/DefaultPluginRealmManagerTest.java ___________________________________________________________________ Nazwa: svn:keywords + "Author Date Id Revision" Nazwa: svn:eol-style + native Index: src/main/java/org/apache/maven/plugin/PluginRealmManager.java =================================================================== --- src/main/java/org/apache/maven/plugin/PluginRealmManager.java (wersja 0) +++ src/main/java/org/apache/maven/plugin/PluginRealmManager.java (wersja 0) @@ -0,0 +1,18 @@ +package org.apache.maven.plugin; + +import java.util.Set; + +import org.apache.maven.artifact.Artifact; +import org.apache.maven.model.Plugin; +import org.codehaus.plexus.classworlds.realm.ClassRealm; + +/** + * + * @author Piotr Tabor + */ +public interface PluginRealmManager +{ + public static final String ROLE=PluginRealmManager.class.getName(); + + public ClassRealm getOrCreateRealm( Plugin projectPlugin, Artifact pluginArtifact, Set artifacts ) throws PluginManagerException; +} \ brakuje znaku końca linii na końcu pliku Zmiany atrybutów dla: src/main/java/org/apache/maven/plugin/PluginRealmManager.java ___________________________________________________________________ Nazwa: svn:keywords + "Author Date Id Revision" Nazwa: svn:eol-style + native Index: src/main/java/org/apache/maven/plugin/DefaultPluginRealmManager.java =================================================================== --- src/main/java/org/apache/maven/plugin/DefaultPluginRealmManager.java (wersja 0) +++ src/main/java/org/apache/maven/plugin/DefaultPluginRealmManager.java (wersja 0) @@ -0,0 +1,153 @@ +package org.apache.maven.plugin; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.resolver.ArtifactNotFoundException; +import org.apache.maven.artifact.resolver.ArtifactResolutionException; +import org.apache.maven.model.Plugin; +import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.PlexusContainer; +import org.codehaus.plexus.PlexusContainerException; +import org.codehaus.plexus.classworlds.realm.ClassRealm; +import org.codehaus.plexus.classworlds.realm.NoSuchRealmException; +import org.codehaus.plexus.logging.AbstractLogEnabled; +import org.codehaus.plexus.util.xml.Xpp3Dom; + +/** + * @author Piotr Tabor + */ +public class DefaultPluginRealmManager + extends AbstractLogEnabled + implements PluginRealmManager +{ + private PlexusContainer container; + + public ClassRealm getOrCreateRealm( Plugin projectPlugin, Artifact pluginArtifact, Set artifacts ) + throws PluginManagerException + { + Set allArtifacts = new HashSet( artifacts ); + allArtifacts.add( pluginArtifact ); + + List/* */pluginJars = generateJarsListForArtifacts( allArtifacts ); + + String realmKey = generateChildContainerName( projectPlugin, allArtifacts ); + ClassRealm pluginRealm = container.getComponentRealm( realmKey ); + + if ( ( pluginRealm != null ) && ( pluginRealm != container.getContainerRealm() ) ) + { + getLogger().debug( "Realm already exists for: " + realmKey + ". Skipping addition..." ); + /* + * we've already discovered this plugin, and configured it, so skip it this time. + */ + return pluginRealm; + } + + // ---------------------------------------------------------------------------- + // Realm creation for a plugin + // ---------------------------------------------------------------------------- + + ClassRealm componentRealm = null; + + try + { + // Now here we need the artifact coreArtifactFilter + // stuff + + componentRealm = container.createComponentRealm( realmKey, pluginJars ); + + /* + * adding for MNG-3012 to try to work around problems with Xpp3Dom (from plexus-utils spawning a + * ClassCastException when a mojo calls plugin.getConfiguration() from maven-model... + */ + componentRealm.importFrom( componentRealm.getParentRealm().getId(), Xpp3Dom.class.getName() ); + componentRealm.importFrom( componentRealm.getParentRealm().getId(), "org.codehaus.plexus.util.xml.pull" ); + + /* + * Adding for MNG-2878, since maven-reporting-impl was removed from the internal list of artifacts managed + * by maven, the classloader is different between maven-reporting-impl and maven-reporting-api...so this + * resource is not available from the AbstractMavenReport since it uses: getClass().getResourceAsStream( + * "/default-report.xml" ) (maven-reporting-impl version 2.0; line 134; affects: checkstyle plugin, and + * probably others) + */ + componentRealm.importFrom( componentRealm.getParentRealm().getId(), "/default-report.xml" ); + + } + catch ( PlexusContainerException e ) + { + throw new PluginManagerException( "Failed to create realm for plugin '" + projectPlugin + ".", e ); + } + catch ( NoSuchRealmException e ) + { + throw new PluginManagerException( "Failed to import Xpp3Dom from parent realm for plugin: '" + + projectPlugin + ".", e ); + } + + getLogger().debug( "Realm for plugin: " + realmKey + ":\n" + componentRealm ); + + // ---------------------------------------------------------------------------- + // The PluginCollector will now know about the plugin we + // are trying to load + // ---------------------------------------------------------------------------- + + return componentRealm; + } + + List/* */generateJarsListForArtifacts( Set/* */artifacts ) + { + List/* */jars = new ArrayList(); + + for ( Iterator i = artifacts.iterator(); i.hasNext(); ) + { + Artifact artifact = (Artifact) i.next(); + + jars.add( artifact.getFile() ); + } + + return jars; + } + + + private static String generateChildContainerName( Plugin plugin, Set artifacts ) + { + return plugin.getKey() + ":" + plugin.getVersion() + ":" + getHashOfArtifacts( artifacts ); + } + + static long getHashOfArtifacts( Set a ) + { + long i = 1; + Iterator/* */iterator = a.iterator(); + while ( iterator.hasNext() ) + { + Artifact artifact = (Artifact) iterator.next(); + i = ( i * artifact.hashCode() ) % 2147483647 /* big prime */; + } + return i; + } +} Zmiany atrybutów dla: src/main/java/org/apache/maven/plugin/DefaultPluginRealmManager.java ___________________________________________________________________ Nazwa: svn:keywords + "Author Date Id Revision" Nazwa: svn:eol-style + native Index: src/main/java/org/apache/maven/plugin/MavenPluginCollector.java =================================================================== --- src/main/java/org/apache/maven/plugin/MavenPluginCollector.java (wersja 575970) +++ src/main/java/org/apache/maven/plugin/MavenPluginCollector.java (kopia robocza) @@ -26,23 +26,33 @@ import org.codehaus.plexus.component.repository.ComponentSetDescriptor; import org.codehaus.plexus.logging.AbstractLogEnabled; +import com.sun.jmx.remote.util.OrderClassLoaders; + import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; public class MavenPluginCollector extends AbstractLogEnabled implements ComponentDiscoveryListener { + /** + * Map from pluginDescriptor.getKey (groupId:artifactId) into (ordered) map from version into pluginDescriptor + * Internal map is ordered to make sure that builds are determinic (used pluginVersion is determined) + */ + private Map/* > */pluginDescriptors = new HashMap(); - private Set pluginsInProcess = new HashSet(); + private Map/* > */pluginIdsByPrefix = new HashMap(); - private Map pluginDescriptors = new HashMap(); - - private Map pluginIdsByPrefix = new HashMap(); - + public String getId() + { + return "maven-plugin-collector"; + } + // ---------------------------------------------------------------------- // Mojo discovery // ---------------------------------------------------------------------- @@ -53,66 +63,125 @@ if ( componentSetDescriptor instanceof PluginDescriptor ) { PluginDescriptor pluginDescriptor = (PluginDescriptor) componentSetDescriptor; - - // TODO: see comment in getPluginDescriptor - String key = Plugin.constructKey( pluginDescriptor.getGroupId(), pluginDescriptor.getArtifactId() ); - if ( !pluginsInProcess.contains( key ) ) - { - pluginsInProcess.add( key ); - - getLogger().debug( this + ": Discovered plugin: " + key ); - - pluginDescriptors.put( key, pluginDescriptor ); - - // TODO: throw an (not runtime) exception if there is a prefix overlap - means doing so elsewhere - // we also need to deal with multiple versions somehow - currently, first wins - if ( !pluginIdsByPrefix.containsKey( pluginDescriptor.getGoalPrefix() ) ) - { - pluginIdsByPrefix.put( pluginDescriptor.getGoalPrefix(), pluginDescriptor ); - } - } + putIntoPluginDescriptors( pluginDescriptor ); + putIntoPluginIdsByPrefix( pluginDescriptor ); } } - public String getId() + public PluginDescriptor getPluginDescriptor( Plugin plugin ) { - return "maven-plugin-collector"; + SortedMap/* */pluginVersions = (SortedMap) pluginDescriptors.get( plugin.getKey() ); + if ( pluginVersions != null ) + { + PluginDescriptor res; + if ( plugin.getVersion() != null ) + { + res = (PluginDescriptor) pluginVersions.get( plugin.getVersion() ); + } + else + { + res = getDefaultPluginDescriptorVersion( pluginVersions ); + } + return res; + } + else + { + return null; + } } - public PluginDescriptor getPluginDescriptor( Plugin plugin ) + private PluginDescriptor getDefaultPluginDescriptorVersion( SortedMap pluginVersions ) { - // TODO: include version, but can't do this in the plugin manager as it is not resolved to the right version - // at that point. Instead, move the duplication check to the artifact container, or store it locally based on - // the unresolved version? - return (PluginDescriptor) pluginDescriptors.get( plugin.getKey() ); + if ( pluginVersions.size() > 0 ) + { + return (PluginDescriptor) pluginVersions.get( pluginVersions.lastKey() ); + } + else + { + return null; + } } public boolean isPluginInstalled( Plugin plugin ) { // TODO: see comment in getPluginDescriptor - return pluginDescriptors.containsKey( plugin.getKey() ); + return getPluginDescriptor( plugin ) != null; } public PluginDescriptor getPluginDescriptorForPrefix( String prefix ) { - return (PluginDescriptor) pluginIdsByPrefix.get( prefix ); + return getPluginDescriptorForPrefix( prefix, null ); } - public void flushPluginDescriptor( Plugin plugin ) + public PluginDescriptor getPluginDescriptorForPrefix( String prefix, String version ) { - pluginsInProcess.remove( plugin.getKey() ); - pluginDescriptors.remove( plugin.getKey() ); - - for ( Iterator it = pluginIdsByPrefix.entrySet().iterator(); it.hasNext(); ) + SortedMap/* */pluginVersions = (SortedMap) pluginIdsByPrefix.get( prefix ); + if ( pluginVersions != null ) { - Map.Entry entry = (Map.Entry) it.next(); - - if ( plugin.getKey().equals( entry.getValue() ) ) + PluginDescriptor res; + if ( version != null ) { - it.remove(); + res = (PluginDescriptor) pluginVersions.get( version ); } + else + { + res = getDefaultPluginDescriptorVersion( pluginVersions ); + } + return res; } + else + { + return null; + } } +// public void flushPluginDescriptor( Plugin plugin ) +// { +// getPluginDescriptor( plugin ).cleanPluginDescriptor(); +// } + + /** + * Puts given pluginDescriptor into pluginDescriptors map (if the map does not contains plugin for specified maven + * version) + * + * @param pluginDescriptor + */ + protected void putIntoPluginDescriptors( PluginDescriptor pluginDescriptor ) + { + String key = Plugin.constructKey( pluginDescriptor.getGroupId(), pluginDescriptor.getArtifactId() ); + + SortedMap/* */descriptorsVersions = (SortedMap) pluginDescriptors.get( key ); + if ( descriptorsVersions == null ) + { + descriptorsVersions = new TreeMap(); + pluginDescriptors.put( key, descriptorsVersions ); + } + + putIntoVersionsMap( descriptorsVersions, pluginDescriptor ); + } + + protected void putIntoVersionsMap( SortedMap/* */pluginVersions, + PluginDescriptor pluginDescriptor ) + { + if ( !pluginVersions.containsKey( pluginDescriptor.getVersion() ) ) + { + pluginVersions.put( pluginDescriptor.getVersion(), pluginDescriptor ); + } + } + + protected void putIntoPluginIdsByPrefix( PluginDescriptor pluginDescriptor ) + { + String goalPrefix = pluginDescriptor.getGoalPrefix(); + + SortedMap/* */descriptorsVersions = (SortedMap) pluginIdsByPrefix.get( goalPrefix ); + if ( descriptorsVersions == null ) + { + descriptorsVersions = new TreeMap(); + pluginIdsByPrefix.put( goalPrefix, descriptorsVersions ); + } + + putIntoVersionsMap( descriptorsVersions, pluginDescriptor ); + } + } Index: src/main/java/org/apache/maven/plugin/DefaultPluginManager.java =================================================================== --- src/main/java/org/apache/maven/plugin/DefaultPluginManager.java (wersja 575970) +++ src/main/java/org/apache/maven/plugin/DefaultPluginManager.java (kopia robocza) @@ -105,6 +105,8 @@ RESERVED_GROUP_IDS = rgids; } + + protected PluginRealmManager pluginRealmManager; protected PlexusContainer container; @@ -377,69 +379,72 @@ { // TODO When/if we go to project-level plugin instances (like for plugin-level deps in the // POM), we need to undo this somehow. - ClassRealm pluginRealm = container.getComponentRealm( projectPlugin.getKey() ); - if ( ( pluginRealm != null ) && ( pluginRealm != container.getContainerRealm() ) ) - { - getLogger().debug( - "Realm already exists for: " + projectPlugin.getKey() - + ". Skipping addition..." ); - // we've already discovered this plugin, and configured it, so skip it this time. + ClassRealm componentRealm = pluginRealmManager.getOrCreateRealm(projectPlugin, pluginArtifact, artifacts); + +// ClassRealm pluginRealm = container.getComponentRealm( projectPlugin.getKey()+":"+projectPlugin.getVersion() ); - return; - } +// if ( ( pluginRealm != null ) && ( pluginRealm != container.getContainerRealm() ) ) +// { +// getLogger().debug( +// "Realm already exists for: " + projectPlugin.getKey() +// + ". Skipping addition..." ); +// // we've already discovered this plugin, and configured it, so skip it this time. +// +// return; +// } +// +// // ---------------------------------------------------------------------------- +// // Realm creation for a plugin +// // ---------------------------------------------------------------------------- +// +// ClassRealm componentRealm = null; +// +// try +// { +// List jars = new ArrayList(); +// +// for ( Iterator i = artifacts.iterator(); i.hasNext(); ) +// { +// Artifact artifact = (Artifact) i.next(); +// +// jars.add( artifact.getFile() ); +// } +// +// jars.add( pluginArtifact.getFile() ); +// +// // Now here we need the artifact coreArtifactFilter stuff +// +// componentRealm = container.createComponentRealm( projectPlugin.getKey()+projectPlugin.getVersion(), jars ); +// +// // adding for MNG-3012 to try to work around problems with Xpp3Dom (from plexus-utils) +// // spawning a ClassCastException when a mojo calls plugin.getConfiguration() from maven-model... +// componentRealm.importFrom( componentRealm.getParentRealm().getId(), +// Xpp3Dom.class.getName() ); +// componentRealm.importFrom( componentRealm.getParentRealm().getId(), +// "org.codehaus.plexus.util.xml.pull" ); +// +// // Adding for MNG-2878, since maven-reporting-impl was removed from the +// // internal list of artifacts managed by maven, the classloader is different +// // between maven-reporting-impl and maven-reporting-api...so this resource +// // is not available from the AbstractMavenReport since it uses: +// // getClass().getResourceAsStream( "/default-report.xml" ) +// // (maven-reporting-impl version 2.0; line 134; affects: checkstyle plugin, and probably others) +// componentRealm.importFrom( componentRealm.getParentRealm().getId(), "/default-report.xml" ); +// } +// catch ( PlexusContainerException e ) +// { +// throw new PluginManagerException( "Failed to create realm for plugin '" + projectPlugin +// + ".", e ); +// } +// catch ( NoSuchRealmException e ) +// { +// throw new PluginManagerException( +// "Failed to import Xpp3Dom from parent realm for plugin: '" +// + projectPlugin + ".", e ); +// } // ---------------------------------------------------------------------------- - // Realm creation for a plugin - // ---------------------------------------------------------------------------- - - ClassRealm componentRealm = null; - - try - { - List jars = new ArrayList(); - - for ( Iterator i = artifacts.iterator(); i.hasNext(); ) - { - Artifact artifact = (Artifact) i.next(); - - jars.add( artifact.getFile() ); - } - - jars.add( pluginArtifact.getFile() ); - - // Now here we need the artifact coreArtifactFilter stuff - - componentRealm = container.createComponentRealm( projectPlugin.getKey(), jars ); - - // adding for MNG-3012 to try to work around problems with Xpp3Dom (from plexus-utils) - // spawning a ClassCastException when a mojo calls plugin.getConfiguration() from maven-model... - componentRealm.importFrom( componentRealm.getParentRealm().getId(), - Xpp3Dom.class.getName() ); - componentRealm.importFrom( componentRealm.getParentRealm().getId(), - "org.codehaus.plexus.util.xml.pull" ); - - // Adding for MNG-2878, since maven-reporting-impl was removed from the - // internal list of artifacts managed by maven, the classloader is different - // between maven-reporting-impl and maven-reporting-api...so this resource - // is not available from the AbstractMavenReport since it uses: - // getClass().getResourceAsStream( "/default-report.xml" ) - // (maven-reporting-impl version 2.0; line 134; affects: checkstyle plugin, and probably others) - componentRealm.importFrom( componentRealm.getParentRealm().getId(), "/default-report.xml" ); - } - catch ( PlexusContainerException e ) - { - throw new PluginManagerException( "Failed to create realm for plugin '" + projectPlugin - + ".", e ); - } - catch ( NoSuchRealmException e ) - { - throw new PluginManagerException( - "Failed to import Xpp3Dom from parent realm for plugin: '" - + projectPlugin + ".", e ); - } - - // ---------------------------------------------------------------------------- // The PluginCollector will now know about the plugin we are trying to load // ---------------------------------------------------------------------------- Index: src/main/resources/META-INF/plexus/components.xml =================================================================== --- src/main/resources/META-INF/plexus/components.xml (wersja 575970) +++ src/main/resources/META-INF/plexus/components.xml (kopia robocza) @@ -64,7 +64,10 @@ org.apache.maven.plugin.MavenPluginCollector - + + org.apache.maven.plugin.PluginRealmManager + + org.apache.maven.plugin.version.PluginVersionManager default @@ -728,5 +731,14 @@ + + org.apache.maven.plugin.PluginRealmManager + org.apache.maven.plugin.DefaultPluginRealmManager + + + org.codehaus.plexus.PlexusContainer + + +