mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-08 06:25:45 +01:00
use ClassLoaderLeakPreventor to reduce ClassLoaderLeaks of plugins
This commit is contained in:
@@ -48,16 +48,7 @@ public class ChildFirstPluginClassLoader extends ChildFirstURLClassLoader
|
||||
implements PluginClassLoader
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructs ...
|
||||
*
|
||||
*
|
||||
* @param urls
|
||||
*/
|
||||
public ChildFirstPluginClassLoader(URL[] urls)
|
||||
{
|
||||
super(urls);
|
||||
}
|
||||
private final String plugin;
|
||||
|
||||
/**
|
||||
* Constructs ...
|
||||
@@ -66,8 +57,14 @@ public class ChildFirstPluginClassLoader extends ChildFirstURLClassLoader
|
||||
* @param urls
|
||||
* @param parent
|
||||
*/
|
||||
public ChildFirstPluginClassLoader(URL[] urls, ClassLoader parent)
|
||||
public ChildFirstPluginClassLoader(URL[] urls, ClassLoader parent, String plugin)
|
||||
{
|
||||
super(urls, parent);
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ChildFirstPluginClassLoader.class.getName() + " for plugin " + plugin;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,16 +46,7 @@ public class DefaultPluginClassLoader extends URLClassLoader
|
||||
implements PluginClassLoader
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructs ...
|
||||
*
|
||||
*
|
||||
* @param urls
|
||||
*/
|
||||
public DefaultPluginClassLoader(URL[] urls)
|
||||
{
|
||||
super(urls);
|
||||
}
|
||||
private final String plugin;
|
||||
|
||||
/**
|
||||
* Constructs ...
|
||||
@@ -64,8 +55,14 @@ public class DefaultPluginClassLoader extends URLClassLoader
|
||||
* @param urls
|
||||
* @param parent
|
||||
*/
|
||||
public DefaultPluginClassLoader(URL[] urls, ClassLoader parent)
|
||||
public DefaultPluginClassLoader(URL[] urls, ClassLoader parent, String plugin)
|
||||
{
|
||||
super(urls, parent);
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return DefaultPluginClassLoader.class.getName() + " for plugin " + plugin;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ import com.google.common.collect.Sets;
|
||||
import com.google.common.hash.Hashing;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import sonia.scm.boot.ClassLoaderLifeCycle;
|
||||
import sonia.scm.plugin.ExplodedSmp.PathTransformer;
|
||||
|
||||
import javax.xml.bind.JAXBContext;
|
||||
@@ -105,14 +106,18 @@ public final class PluginProcessor
|
||||
|
||||
//~--- constructors ---------------------------------------------------------
|
||||
|
||||
private ClassLoaderLifeCycle classLoaderLifeCycle;
|
||||
|
||||
/**
|
||||
* Constructs ...
|
||||
*
|
||||
*
|
||||
* @param classLoaderLifeCycle
|
||||
* @param pluginDirectory
|
||||
*/
|
||||
public PluginProcessor(Path pluginDirectory)
|
||||
public PluginProcessor(ClassLoaderLifeCycle classLoaderLifeCycle, Path pluginDirectory)
|
||||
{
|
||||
this.classLoaderLifeCycle = classLoaderLifeCycle;
|
||||
this.pluginDirectory = pluginDirectory;
|
||||
this.installedDirectory = findInstalledDirectory();
|
||||
|
||||
@@ -372,18 +377,17 @@ public final class PluginProcessor
|
||||
URL[] urlArray = urls.toArray(new URL[urls.size()]);
|
||||
Plugin plugin = smp.getPlugin();
|
||||
|
||||
String id = plugin.getInformation().getId(false);
|
||||
|
||||
if (smp.getPlugin().isChildFirstClassLoader())
|
||||
{
|
||||
logger.debug("create child fist classloader for plugin {}",
|
||||
plugin.getInformation().getId());
|
||||
classLoader = new ChildFirstPluginClassLoader(urlArray,
|
||||
parentClassLoader);
|
||||
logger.debug("create child fist classloader for plugin {}", id);
|
||||
classLoader = classLoaderLifeCycle.createChildFirstPluginClassLoader(urlArray, parentClassLoader, id);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.debug("create parent fist classloader for plugin {}",
|
||||
plugin.getInformation().getId());
|
||||
classLoader = new DefaultPluginClassLoader(urlArray, parentClassLoader);
|
||||
logger.debug("create parent fist classloader for plugin {}", id);
|
||||
classLoader = classLoaderLifeCycle.createPluginClassLoader(urlArray, parentClassLoader, id);
|
||||
}
|
||||
|
||||
return classLoader;
|
||||
|
||||
@@ -41,6 +41,7 @@ import com.google.common.io.Files;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import sonia.scm.boot.ClassLoaderLifeCycle;
|
||||
import sonia.scm.util.IOUtil;
|
||||
|
||||
//~--- JDK imports ------------------------------------------------------------
|
||||
@@ -86,13 +87,13 @@ public final class PluginsInternal
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
public static Set<PluginWrapper> collectPlugins(ClassLoader classLoader,
|
||||
Path directory)
|
||||
public static Set<PluginWrapper> collectPlugins(ClassLoaderLifeCycle classLoaderLifeCycle,
|
||||
Path directory)
|
||||
throws IOException
|
||||
{
|
||||
PluginProcessor processor = new PluginProcessor(directory);
|
||||
PluginProcessor processor = new PluginProcessor(classLoaderLifeCycle, directory);
|
||||
|
||||
return processor.collectPlugins(classLoader);
|
||||
return processor.collectPlugins(classLoaderLifeCycle.getBootstrapClassLoader());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user