Author: bentmann Date: Sat Nov 13 21:09:45 2010 New Revision: 1034880 URL: http://svn.apache.org/viewvc?rev=1034880&view=rev Log: [MNG-4895] Plugins depending on 3rd party JARs that contain the Maven API can't be configured/run due to type incompatibilities
Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmManager.java maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmRequest.java maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmRequest.java maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java maven/maven-3/trunk/pom.xml Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmManager.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmManager.java?rev=1034880&r1=1034879&r2=1034880&view=diff ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmManager.java (original) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmManager.java Sat Nov 13 21:09:45 2010 @@ -20,6 +20,7 @@ package org.apache.maven.classrealm; */ import java.util.List; +import java.util.Map; import org.apache.maven.model.Model; import org.apache.maven.model.Plugin; @@ -44,6 +45,13 @@ public interface ClassRealmManager ClassRealm getCoreRealm(); /** + * Gets the class realm exposing the Maven API. This is basically a restricted view on the Maven core realm. + * + * @return The class realm exposing the Maven API, never {...@code null}. + */ + ClassRealm getMavenApiRealm(); + + /** * Creates a new class realm for the specified project and its build extensions. * * @param model The model of the project for which to create a realm, must not be {...@code null}. @@ -67,12 +75,14 @@ public interface ClassRealmManager * Creates a new class realm for the specified plugin. * * @param plugin The plugin for which to create a realm, must not be {...@code null}. - * @param parent The parent realm for the new realm, may be {...@code null} to use the Maven core realm. - * @param imports The packages/types to import from the parent realm, may be {...@code null}. + * @param parent The parent realm for the new realm, may be {...@code null}. + * @param parentImports The packages/types to import from the parent realm, may be {...@code null}. + * @param foreignImports The packages/types to import from foreign realms, may be {...@code null}. * @param artifacts The artifacts to add to the class realm, may be {...@code null}. Unresolved artifacts (i.e. with a * missing file) will automatically be excluded from the realm. * @return The new plugin realm, never {...@code null}. */ - ClassRealm createPluginRealm( Plugin plugin, ClassLoader parent, List<String> imports, List<Artifact> artifacts ); + ClassRealm createPluginRealm( Plugin plugin, ClassLoader parent, List<String> parentImports, + Map<String, ClassLoader> foreignImports, List<Artifact> artifacts ); } Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmRequest.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmRequest.java?rev=1034880&r1=1034879&r2=1034880&view=diff ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmRequest.java (original) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmRequest.java Sat Nov 13 21:09:45 2010 @@ -20,6 +20,7 @@ package org.apache.maven.classrealm; */ import java.util.List; +import java.util.Map; /** * Describes the requirements for a new class realm. @@ -65,16 +66,29 @@ public interface ClassRealmRequest /** * Gets the parent class realm (if any). * - * @return The parent class realm or {...@code null} if using the Maven core realm as parent. + * @return The parent class realm or {...@code null} if using the default parent. */ ClassLoader getParent(); /** + * @deprecated Use {...@link #getParentImports()} instead. + */ + @Deprecated + List<String> getImports(); + + /** * Gets the packages/types to import from the parent realm. * * @return The modifiable list of packages/types to import from the parent realm, never {...@code null}. */ - List<String> getImports(); + List<String> getParentImports(); + + /** + * Gets the packages/types to import from foreign realms. + * + * @return The modifiable map of packages/types to import from foreign realms, never {...@code null}. + */ + Map<String, ClassLoader> getForeignImports(); /** * Gets the constituents for the class realm. Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java?rev=1034880&r1=1034879&r2=1034880&view=diff ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java (original) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java Sat Nov 13 21:09:45 2010 @@ -23,10 +23,13 @@ import java.io.File; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.TreeMap; import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.classrealm.ClassRealmRequest.RealmType; @@ -100,48 +103,116 @@ public class DefaultClassRealmManager } } - private synchronized ClassRealm getMavenRealm() + public synchronized ClassRealm getMavenApiRealm() { if ( mavenRealm == null ) { mavenRealm = newRealm( "maven.api" ); - importMavenApi( mavenRealm ); + List<ClassRealmConstituent> constituents = new ArrayList<ClassRealmConstituent>(); - mavenRealm.setParentClassLoader( ClassLoader.getSystemClassLoader() ); + List<String> parentImports = new ArrayList<String>(); - List<ClassRealmManagerDelegate> delegates = getDelegates(); - if ( !delegates.isEmpty() ) - { - List<ClassRealmConstituent> constituents = new ArrayList<ClassRealmConstituent>(); + Map<String, ClassLoader> foreignImports = new HashMap<String, ClassLoader>(); + importMavenApi( foreignImports ); - ClassRealmRequest request = - new DefaultClassRealmRequest( RealmType.Core, null, new ArrayList<String>(), constituents ); + callDelegates( mavenRealm, RealmType.Core, mavenRealm.getParentClassLoader(), parentImports, + foreignImports, constituents ); - for ( ClassRealmManagerDelegate delegate : delegates ) - { - delegate.setupRealm( mavenRealm, request ); - } + wireRealm( mavenRealm, parentImports, foreignImports ); - populateRealm( mavenRealm, constituents ); - } + populateRealm( mavenRealm, constituents ); } + return mavenRealm; } + private void importMavenApi( Map<String, ClassLoader> imports ) + { + ClassRealm coreRealm = getCoreRealm(); + + // maven-* + imports.put( "org.apache.maven.*", coreRealm ); + imports.put( "org.apache.maven.artifact", coreRealm ); + imports.put( "org.apache.maven.classrealm", coreRealm ); + imports.put( "org.apache.maven.cli", coreRealm ); + imports.put( "org.apache.maven.configuration", coreRealm ); + imports.put( "org.apache.maven.exception", coreRealm ); + imports.put( "org.apache.maven.execution", coreRealm ); + imports.put( "org.apache.maven.lifecycle", coreRealm ); + imports.put( "org.apache.maven.model", coreRealm ); + imports.put( "org.apache.maven.monitor", coreRealm ); + imports.put( "org.apache.maven.plugin", coreRealm ); + imports.put( "org.apache.maven.profiles", coreRealm ); + imports.put( "org.apache.maven.project", coreRealm ); + imports.put( "org.apache.maven.reporting", coreRealm ); + imports.put( "org.apache.maven.repository", coreRealm ); + imports.put( "org.apache.maven.settings", coreRealm ); + imports.put( "org.apache.maven.toolchain", coreRealm ); + imports.put( "org.apache.maven.usability", coreRealm ); + + // wagon-api + imports.put( "org.apache.maven.wagon.*", coreRealm ); + imports.put( "org.apache.maven.wagon.authentication", coreRealm ); + imports.put( "org.apache.maven.wagon.authorization", coreRealm ); + imports.put( "org.apache.maven.wagon.events", coreRealm ); + imports.put( "org.apache.maven.wagon.observers", coreRealm ); + imports.put( "org.apache.maven.wagon.proxy", coreRealm ); + imports.put( "org.apache.maven.wagon.repository", coreRealm ); + imports.put( "org.apache.maven.wagon.resource", coreRealm ); + + // aether-api, aether-spi, aether-impl + imports.put( "org.sonatype.aether.*", coreRealm ); + imports.put( "org.sonatype.aether.artifact", coreRealm ); + imports.put( "org.sonatype.aether.collection", coreRealm ); + imports.put( "org.sonatype.aether.deployment", coreRealm ); + imports.put( "org.sonatype.aether.graph", coreRealm ); + imports.put( "org.sonatype.aether.impl", coreRealm ); + imports.put( "org.sonatype.aether.installation", coreRealm ); + imports.put( "org.sonatype.aether.metadata", coreRealm ); + imports.put( "org.sonatype.aether.repository", coreRealm ); + imports.put( "org.sonatype.aether.resolution", coreRealm ); + imports.put( "org.sonatype.aether.spi", coreRealm ); + imports.put( "org.sonatype.aether.transfer", coreRealm ); + imports.put( "org.sonatype.aether.version", coreRealm ); + + // plexus-classworlds + imports.put( "org.codehaus.plexus.classworlds", coreRealm ); + + // classworlds (for legacy code) + imports.put( "org.codehaus.classworlds", coreRealm ); + + // plexus-container, plexus-component-annotations + imports.put( "org.codehaus.plexus.*", coreRealm ); + imports.put( "org.codehaus.plexus.component", coreRealm ); + imports.put( "org.codehaus.plexus.configuration", coreRealm ); + imports.put( "org.codehaus.plexus.container", coreRealm ); + imports.put( "org.codehaus.plexus.context", coreRealm ); + imports.put( "org.codehaus.plexus.lifecycle", coreRealm ); + imports.put( "org.codehaus.plexus.logging", coreRealm ); + imports.put( "org.codehaus.plexus.personality", coreRealm ); + + // plexus-utils (for maven-model) + imports.put( "org.codehaus.plexus.util.xml.Xpp3Dom", coreRealm ); + imports.put( "org.codehaus.plexus.util.xml.pull.XmlPullParser", coreRealm ); + imports.put( "org.codehaus.plexus.util.xml.pull.XmlPullParserException", coreRealm ); + imports.put( "org.codehaus.plexus.util.xml.pull.XmlSerializer", coreRealm ); + } + /** * Creates a new class realm with the specified parent and imports. * * @param baseRealmId The base id to use for the new realm, must not be {...@code null}. * @param type The type of the class realm, must not be {...@code null}. - * @param parent The parent realm for the new realm, may be {...@code null} to use the Maven core realm. - * @param imports The packages/types to import from the parent realm, may be {...@code null}. + * @param parent The parent realm for the new realm, may be {...@code null}. + * @param parentImports The packages/types to import from the parent realm, may be {...@code null}. + * @param foreignImports The packages/types to import from foreign realms, may be {...@code null}. * @param artifacts The artifacts to add to the realm, may be {...@code null}. Unresolved artifacts (i.e. with a * missing file) will automatically be excluded from the realm. * @return The created class realm, never {...@code null}. */ - private ClassRealm createRealm( String baseRealmId, RealmType type, ClassLoader parent, List<String> imports, - boolean importXpp3Dom, List<Artifact> artifacts ) + private ClassRealm createRealm( String baseRealmId, RealmType type, ClassLoader parent, List<String> parentImports, + Map<String, ClassLoader> foreignImports, List<Artifact> artifacts ) { Set<String> artifactIds = new LinkedHashSet<String>(); @@ -159,61 +230,34 @@ public class DefaultClassRealmManager } } - if ( imports != null ) + if ( parentImports != null ) { - imports = new ArrayList<String>( imports ); + parentImports = new ArrayList<String>( parentImports ); } else { - imports = new ArrayList<String>(); + parentImports = new ArrayList<String>(); } - ClassRealm classRealm = newRealm( baseRealmId ); - - if ( parent != null ) + if ( foreignImports != null ) { - classRealm.setParentClassLoader( parent ); + foreignImports = new TreeMap<String, ClassLoader>( foreignImports ); } else { - classRealm.setParentRealm( getMavenRealm() ); + foreignImports = new TreeMap<String, ClassLoader>(); } - List<ClassRealmManagerDelegate> delegates = getDelegates(); - if ( !delegates.isEmpty() ) - { - ClassRealmRequest request = new DefaultClassRealmRequest( type, parent, imports, constituents ); - - for ( ClassRealmManagerDelegate delegate : delegates ) - { - delegate.setupRealm( classRealm, request ); - } - } + ClassRealm classRealm = newRealm( baseRealmId ); - if ( importXpp3Dom ) + if ( parent != null ) { - importXpp3Dom( classRealm ); + classRealm.setParentClassLoader( parent ); } - if ( !imports.isEmpty() ) - { - ClassLoader importedRealm = classRealm.getParentClassLoader(); - - if ( logger.isDebugEnabled() ) - { - logger.debug( "Importing packages into class realm " + classRealm.getId() ); - } - - for ( String imp : imports ) - { - if ( logger.isDebugEnabled() ) - { - logger.debug( " Imported: " + imp ); - } + callDelegates( classRealm, type, parent, parentImports, foreignImports, constituents ); - classRealm.importFrom( importedRealm, imp ); - } - } + wireRealm( classRealm, parentImports, foreignImports ); Set<String> includedIds = populateRealm( classRealm, constituents ); @@ -230,64 +274,6 @@ public class DefaultClassRealmManager return classRealm; } - /** - * Imports Xpp3Dom and associated types into the specified realm. Unlike the other archives that constitute the API - * realm, plexus-utils is not excluded from the plugin/project realm, yet we must ensure this class is loaded from - * the API realm and not from the plugin/project realm. - * - * @param importingRealm The realm into which to import Xpp3Dom, must not be {...@code null}. - */ - private void importXpp3Dom( ClassRealm importingRealm ) - { - ClassRealm coreRealm = getCoreRealm(); - - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.util.xml.Xpp3Dom" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.util.xml.pull.XmlPullParser" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.util.xml.pull.XmlPullParserException" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.util.xml.pull.XmlSerializer" ); - } - - /** - * Imports the classes/resources constituting the Maven API into the specified realm. - * - * @param importingRealm The realm into which to import the Maven API, must not be {...@code null}. - */ - private void importMavenApi( ClassRealm importingRealm ) - { - ClassRealm coreRealm = getCoreRealm(); - - // maven-* - importingRealm.importFrom( coreRealm, "org.apache.maven" ); - - // aether - importingRealm.importFrom( coreRealm, "org.sonatype.aether" ); - - // plexus-classworlds - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.classworlds" ); - - // classworlds (for legacy code) - importingRealm.importFrom( coreRealm, "org.codehaus.classworlds" ); - - // plexus-container, plexus-component-annotations - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.component" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.configuration" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.container" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.context" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.lifecycle" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.logging" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.personality" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.ComponentRegistry" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.ContainerConfiguration" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.DefaultComponentRegistry" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.DefaultContainerConfiguration" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.DefaultPlexusContainer" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.DuplicateChildContainerException" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.MutablePlexusContainer" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.PlexusConstants" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.PlexusContainer" ); - importingRealm.importFrom( coreRealm, "org.codehaus.plexus.PlexusContainerException" ); - } - public ClassRealm getCoreRealm() { return container.getContainerRealm(); @@ -300,7 +286,9 @@ public class DefaultClassRealmManager throw new IllegalArgumentException( "model missing" ); } - return createRealm( getKey( model ), RealmType.Project, null, null, false, artifacts ); + ClassLoader parent = getMavenApiRealm(); + + return createRealm( getKey( model ), RealmType.Project, parent, null, null, artifacts ); } private static String getKey( Model model ) @@ -315,18 +303,28 @@ public class DefaultClassRealmManager throw new IllegalArgumentException( "extension plugin missing" ); } - return createRealm( getKey( plugin, true ), RealmType.Extension, null, null, true, artifacts ); + ClassLoader parent = ClassLoader.getSystemClassLoader(); + + Map<String, ClassLoader> foreignImports = + Collections.<String, ClassLoader> singletonMap( "", getMavenApiRealm() ); + + return createRealm( getKey( plugin, true ), RealmType.Extension, parent, null, foreignImports, artifacts ); } - public ClassRealm createPluginRealm( Plugin plugin, ClassLoader parent, List<String> imports, - List<Artifact> artifacts ) + public ClassRealm createPluginRealm( Plugin plugin, ClassLoader parent, List<String> parentImports, + Map<String, ClassLoader> foreignImports, List<Artifact> artifacts ) { if ( plugin == null ) { throw new IllegalArgumentException( "plugin missing" ); } - return createRealm( getKey( plugin, false ), RealmType.Plugin, parent, imports, true, artifacts ); + if ( parent == null ) + { + parent = ClassLoader.getSystemClassLoader(); + } + + return createRealm( getKey( plugin, false ), RealmType.Plugin, parent, parentImports, foreignImports, artifacts ); } private static String getKey( Plugin plugin, boolean extension ) @@ -338,8 +336,8 @@ public class DefaultClassRealmManager private static String getId( Artifact artifact ) { - return getId( artifact.getGroupId(), artifact.getArtifactId(), artifact.getExtension(), artifact.getClassifier(), - artifact.getBaseVersion() ); + return getId( artifact.getGroupId(), artifact.getArtifactId(), artifact.getExtension(), + artifact.getClassifier(), artifact.getBaseVersion() ); } private static String getId( ClassRealmConstituent constituent ) @@ -367,6 +365,31 @@ public class DefaultClassRealmManager } } + private void callDelegates( ClassRealm classRealm, RealmType type, ClassLoader parent, List<String> parentImports, + Map<String, ClassLoader> foreignImports, List<ClassRealmConstituent> constituents ) + { + List<ClassRealmManagerDelegate> delegates = getDelegates(); + + if ( !delegates.isEmpty() ) + { + ClassRealmRequest request = + new DefaultClassRealmRequest( type, parent, parentImports, foreignImports, constituents ); + + for ( ClassRealmManagerDelegate delegate : delegates ) + { + try + { + delegate.setupRealm( classRealm, request ); + } + catch ( Exception e ) + { + logger.error( delegate.getClass().getName() + " failed to setup class realm " + classRealm + ": " + + e.getMessage(), e ); + } + } + } + } + private Set<String> populateRealm( ClassRealm classRealm, List<ClassRealmConstituent> constituents ) { Set<String> includedIds = new LinkedHashSet<String>(); @@ -402,4 +425,55 @@ public class DefaultClassRealmManager return includedIds; } + private void wireRealm( ClassRealm classRealm, List<String> parentImports, Map<String, ClassLoader> foreignImports ) + { + if ( foreignImports != null && !foreignImports.isEmpty() ) + { + if ( logger.isDebugEnabled() ) + { + logger.debug( "Importing foreign packages into class realm " + classRealm.getId() ); + } + + for ( Map.Entry<String, ClassLoader> entry : foreignImports.entrySet() ) + { + ClassLoader importedRealm = entry.getValue(); + String imp = entry.getKey(); + + if ( logger.isDebugEnabled() ) + { + logger.debug( " Imported: " + imp + " < " + getId( importedRealm ) ); + } + + classRealm.importFrom( importedRealm, imp ); + } + } + + if ( parentImports != null && !parentImports.isEmpty() ) + { + if ( logger.isDebugEnabled() ) + { + logger.debug( "Importing parent packages into class realm " + classRealm.getId() ); + } + + for ( String imp : parentImports ) + { + if ( logger.isDebugEnabled() ) + { + logger.debug( " Imported: " + imp + " < " + getId( classRealm.getParentClassLoader() ) ); + } + + classRealm.importFromParent( imp ); + } + } + } + + private String getId( ClassLoader classLoader ) + { + if ( classLoader instanceof ClassRealm ) + { + return ( (ClassRealm) classLoader ).getId(); + } + return String.valueOf( classLoader ); + } + } Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmRequest.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmRequest.java?rev=1034880&r1=1034879&r2=1034880&view=diff ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmRequest.java (original) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmRequest.java Sat Nov 13 21:09:45 2010 @@ -20,6 +20,7 @@ package org.apache.maven.classrealm; */ import java.util.List; +import java.util.Map; /** * @author Benjamin Bentmann @@ -32,16 +33,19 @@ class DefaultClassRealmRequest private final ClassLoader parent; - private final List<String> imports; + private final List<String> parentImports; + + private final Map<String, ClassLoader> foreignImports; private final List<ClassRealmConstituent> constituents; - public DefaultClassRealmRequest( RealmType type, ClassLoader parent, List<String> imports, - List<ClassRealmConstituent> constituents ) + public DefaultClassRealmRequest( RealmType type, ClassLoader parent, List<String> parentImports, + Map<String, ClassLoader> foreignImports, List<ClassRealmConstituent> constituents ) { this.type = type; this.parent = parent; - this.imports = imports; + this.parentImports = parentImports; + this.foreignImports = foreignImports; this.constituents = constituents; } @@ -57,7 +61,17 @@ class DefaultClassRealmRequest public List<String> getImports() { - return imports; + return getParentImports(); + } + + public List<String> getParentImports() + { + return parentImports; + } + + public Map<String, ClassLoader> getForeignImports() + { + return foreignImports; } public List<ClassRealmConstituent> getConstituents() Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java?rev=1034880&r1=1034879&r2=1034880&view=diff ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java (original) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java Sat Nov 13 21:09:45 2010 @@ -183,8 +183,7 @@ public class DefaultBuildPluginManager return pluginRealm; } - mavenPluginManager.setupPluginRealm( pluginDescriptor, session, session.getCurrentProject().getClassRealm(), - null, null ); + mavenPluginManager.setupPluginRealm( pluginDescriptor, session, null, null, null ); return pluginDescriptor.getClassRealm(); } Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java?rev=1034880&r1=1034879&r2=1034880&view=diff ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java (original) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java Sat Nov 13 21:09:45 2010 @@ -30,6 +30,7 @@ import java.io.Reader; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -334,7 +335,10 @@ public class DefaultMavenPluginManager List<org.sonatype.aether.artifact.Artifact> pluginArtifacts = nlg.getArtifacts( true ); - ClassRealm pluginRealm = classRealmManager.createPluginRealm( plugin, parent, imports, pluginArtifacts ); + Map<String, ClassLoader> foreignImports = calcImports( project, parent, imports ); + + ClassRealm pluginRealm = + classRealmManager.createPluginRealm( plugin, parent, null, foreignImports, pluginArtifacts ); pluginDescriptor.setClassRealm( pluginRealm ); pluginDescriptor.setArtifacts( exposedPluginArtifacts ); @@ -361,6 +365,31 @@ public class DefaultMavenPluginManager } } + private Map<String, ClassLoader> calcImports( MavenProject project, ClassLoader parent, List<String> imports ) + { + Map<String, ClassLoader> foreignImports = new HashMap<String, ClassLoader>(); + + ClassLoader projectRealm = project.getClassRealm(); + if ( projectRealm != null ) + { + foreignImports.put( "", projectRealm ); + } + else + { + foreignImports.put( "", classRealmManager.getMavenApiRealm() ); + } + + if ( parent != null && imports != null ) + { + for ( String parentImport : imports ) + { + foreignImports.put( parentImport, parent ); + } + } + + return foreignImports; + } + public <T> T getConfiguredMojo( Class<T> mojoInterface, MavenSession session, MojoExecution mojoExecution ) throws PluginConfigurationException, PluginContainerException { Modified: maven/maven-3/trunk/pom.xml URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/pom.xml?rev=1034880&r1=1034879&r2=1034880&view=diff ============================================================================== --- maven/maven-3/trunk/pom.xml (original) +++ maven/maven-3/trunk/pom.xml Sat Nov 13 21:09:45 2010 @@ -37,7 +37,7 @@ <inceptionYear>2001</inceptionYear> <properties> - <classWorldsVersion>2.2.3</classWorldsVersion> + <classWorldsVersion>2.4</classWorldsVersion> <commonsCliVersion>1.2</commonsCliVersion> <easyMockVersion>1.2_Java1.3</easyMockVersion> <junitVersion>3.8.2</junitVersion>