diff --git a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java index 896236741e..c821ae90ad 100644 --- a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java +++ b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java @@ -29,7 +29,9 @@ import org.apache.maven.model.Plugin; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.classworlds.realm.ClassRealm; +import org.codehaus.plexus.classworlds.realm.NoSuchRealmException; import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.personality.plexus.lifecycle.phase.Disposable; import org.sonatype.aether.RepositorySystemSession; import org.sonatype.aether.graph.DependencyFilter; import org.sonatype.aether.repository.LocalRepository; @@ -41,7 +43,7 @@ */ @Component( role = PluginRealmCache.class ) public class DefaultPluginRealmCache - implements PluginRealmCache + implements PluginRealmCache, Disposable { protected static class CacheKey @@ -179,6 +181,18 @@ public CacheRecord put( Key key, ClassRealm pluginRealm, List pluginAr public void flush() { + for ( CacheRecord record : cache.values() ) + { + ClassRealm realm = record.realm; + try + { + realm.getWorld().disposeRealm( realm.getId() ); + } + catch ( NoSuchRealmException e ) + { + // ignore + } + } cache.clear(); } @@ -197,4 +211,9 @@ public void register( MavenProject project, CacheRecord record ) // default cache does not track plugin usage } + public void dispose() + { + flush(); + } + } diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java index 10d21a2b84..45ea1309cd 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java @@ -55,6 +55,7 @@ import org.apache.maven.lifecycle.LifecycleExecutionException; import org.apache.maven.lifecycle.internal.LifecycleWeaveBuilder; import org.apache.maven.model.building.ModelProcessor; +import org.apache.maven.plugin.PluginRealmCache; import org.apache.maven.project.MavenProject; import org.apache.maven.properties.internal.EnvironmentUtils; import org.apache.maven.settings.building.DefaultSettingsBuildingRequest; @@ -112,9 +113,6 @@ public class MavenCli private ClassWorld classWorld; - // Per-instance container supports fast embedded execution of core ITs - private DefaultPlexusContainer container; - private LoggerManager plexusLoggerManager; private ILoggerFactory slf4jLoggerFactory; @@ -197,7 +195,7 @@ public int doMain( String[] args, String workingDirectory, PrintStream stdout, P // TODO: need to externalize CliRequest public int doMain( CliRequest cliRequest ) { - PlexusContainer localContainer = this.container; + PlexusContainer localContainer = null; try { initialize( cliRequest ); @@ -235,7 +233,7 @@ public int doMain( CliRequest cliRequest ) } finally { - if ( localContainer != this.container ) + if (localContainer != null) { localContainer.dispose(); } @@ -377,10 +375,8 @@ private PlexusContainer container( CliRequest cliRequest ) cliRequest.classWorld = new ClassWorld( "plexus.core", Thread.currentThread().getContextClassLoader() ); } - DefaultPlexusContainer container = this.container; + DefaultPlexusContainer container = null; - if ( container == null ) - { ContainerConfiguration cc = new DefaultContainerConfiguration() .setClassWorld( cliRequest.classWorld ) .setRealm( setupContainerRealm( cliRequest ) ) @@ -405,12 +401,6 @@ protected void configure() customizeContainer( container ); - if ( cliRequest.classWorld == classWorld ) - { - this.container = container; - } - } - container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() ); Thread.currentThread().setContextClassLoader( container.getContainerRealm() );