diff options
author | Igor Fedorenko | 2011-04-12 16:48:21 +0000 |
---|---|---|
committer | Igor Fedorenko | 2011-04-12 17:06:21 +0000 |
commit | fb4e41a5a1801aed779885935d8e950614588aa8 (patch) | |
tree | 8bb0effa05e4b16a56914b24c1a048c86f4c49cf | |
parent | 62c0596af8dcbe241df2fc371bb4816ba1a159bb (diff) | |
download | m2e-core-fb4e41a5a1801aed779885935d8e950614588aa8.tar.gz m2e-core-fb4e41a5a1801aed779885935d8e950614588aa8.tar.xz m2e-core-fb4e41a5a1801aed779885935d8e950614588aa8.zip |
341033 plugged classloader leak during m2e extension discovery
Changed mavn import wizard to properly release MavenProject extensions
realms.
Also removed deprecated IMaven.xxxRemoveExtensionRealm API method and
introduced non-API MavenImpl.releaseExtensionsRealm.
Signed-off-by: Igor Fedorenko <igor@ifedorenko.com>
5 files changed, 16 insertions, 15 deletions
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/MavenPlugin.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/MavenPlugin.java index 711f764e..de98de72 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/MavenPlugin.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/MavenPlugin.java @@ -37,7 +37,7 @@ public final class MavenPlugin { return INSTANCE; } - public IMaven getMaven() { + public static IMaven getMaven() { return MavenPluginActivator.getDefault().getMaven(); } diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/IMaven.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/IMaven.java index 090b6783..122d963c 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/IMaven.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/IMaven.java @@ -177,13 +177,6 @@ public interface IMaven { public Server decryptPassword(Server server) throws CoreException; - /** - * Temporary solution/workaround for http://jira.codehaus.org/browse/MNG-4194. Extensions realm is created each time - * MavenProject instance is built, so we have to remove unused extensions realms to avoid OOME. - */ - @Deprecated - public void xxxRemoveExtensionsRealm(MavenProject project); - /** @provisional */ public void addLocalRepositoryListener(ILocalRepositoryListener listener); diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenImpl.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenImpl.java index d9a5cac7..6807db51 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenImpl.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenImpl.java @@ -828,8 +828,11 @@ public class MavenImpl implements IMaven, IMavenConfigurationChangeListener { } } - @SuppressWarnings("deprecation") - public void xxxRemoveExtensionsRealm(MavenProject project) { + /** + * Temporary solution/workaround for http://jira.codehaus.org/browse/MNG-4194. Extensions realm is created each time + * MavenProject instance is built, so we have to remove unused extensions realms to avoid OOME. + */ + public void releaseExtensionsRealm(MavenProject project) { ClassRealm realm = project.getClassRealm(); if(realm != null && realm != plexus.getContainerRealm()) { ClassWorld world = ((MutablePlexusContainer) plexus).getClassWorld(); diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/lifecyclemapping/discovery/LifecycleMappingConfiguration.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/lifecyclemapping/discovery/LifecycleMappingConfiguration.java index 2e1f8d37..61858d6f 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/lifecyclemapping/discovery/LifecycleMappingConfiguration.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/lifecyclemapping/discovery/LifecycleMappingConfiguration.java @@ -39,6 +39,7 @@ import org.apache.maven.properties.internal.EnvironmentUtils; import org.eclipse.m2e.core.MavenPlugin; import org.eclipse.m2e.core.embedder.IMaven; +import org.eclipse.m2e.core.internal.embedder.MavenImpl; import org.eclipse.m2e.core.internal.lifecyclemapping.LifecycleMappingConfigurationException; import org.eclipse.m2e.core.internal.lifecyclemapping.LifecycleMappingFactory; import org.eclipse.m2e.core.internal.lifecyclemapping.LifecycleMappingResult; @@ -261,13 +262,13 @@ public class LifecycleMappingConfiguration { LifecycleMappingConfiguration result = new LifecycleMappingConfiguration(); List<MavenProjectInfo> nonErrorProjects = new ArrayList<MavenProjectInfo>(); - MavenPlugin mavenPlugin = MavenPlugin.getDefault(); - IMaven maven = mavenPlugin.getMaven(); + IMaven maven = MavenPlugin.getMaven(); for(MavenProjectInfo projectInfo : projects) { if(monitor.isCanceled()) { throw new OperationCanceledException(); } + MavenProject mavenProject = null; try { SubMonitor subMmonitor = SubMonitor.convert(monitor, NLS.bind("Analysing {0}",projectInfo.getLabel()), 1); MavenExecutionRequest request = maven.createExecutionRequest(subMmonitor); @@ -285,7 +286,7 @@ public class LifecycleMappingConfiguration { MavenExecutionResult executionResult = maven.readProject(request, subMmonitor); - MavenProject mavenProject = executionResult.getProject(); + mavenProject = executionResult.getProject(); if(monitor.isCanceled()) { throw new OperationCanceledException(); @@ -390,6 +391,10 @@ public class LifecycleMappingConfiguration { throw ex; } catch (Throwable th) { result.addError(projectInfo, th); + } finally { + if (mavenProject != null) { + ((MavenImpl)maven).releaseExtensionsRealm(mavenProject); + } } } diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryManager.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryManager.java index ec7e6240..ae854e39 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryManager.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryManager.java @@ -159,7 +159,7 @@ public class ProjectRegistryManager { ResolverConfiguration configuration = ResolverConfigurationIO.readResolverConfiguration(pom.getProject()); //this used to just pass in 'true' for 'offline'. when the local repo was removed or //corrupted, though, the project wouldn't load correctly - IMavenConfiguration mavenConfiguration = MavenPlugin.getDefault().getMavenConfiguration(); + IMavenConfiguration mavenConfiguration = MavenPlugin.getMavenConfiguration(); boolean isOffline = mavenConfiguration.isOffline(); MavenExecutionResult executionResult = readProjectWithDependencies(projectRegistry, pom, configuration, // new MavenUpdateRequest(isOffline, false /* updateSnapshots */), @@ -255,7 +255,7 @@ public class ProjectRegistryManager { // can't really happen } if (project != null) { - getMaven().xxxRemoveExtensionsRealm(project); + ((MavenImpl) getMaven()).releaseExtensionsRealm(project); } } |