package org.skywalking.apm.agent.core.plugin; import org.skywalking.apm.logging.ILog; import org.skywalking.apm.logging.LogManager; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; /** * Use the current classloader to read all plugin define file. * The file must be named 'skywalking-plugin.def' * * @author wusheng */ public class PluginResourcesResolver { private static final ILog logger = LogManager.getLogger(PluginResourcesResolver.class); public List<URL> getResources() { List<URL> cfgUrlPaths = new ArrayList<URL>(); Enumeration<URL> urls; try { urls = getDefaultClassLoader().getResources("skywalking-plugin.def"); if (!urls.hasMoreElements()) { logger.info("no plugin files (skywalking-plugin.def) found"); } while (urls.hasMoreElements()) { URL pluginUrl = urls.nextElement(); cfgUrlPaths.add(pluginUrl); logger.info("find skywalking plugin define in {}", pluginUrl); } return cfgUrlPaths; } catch (IOException e) { logger.error("read resources failure.", e); } return null; } /** * Get the classloader. * First get current thread's classloader, * if fail, get {@link PluginResourcesResolver}'s classloader. * * @return the classloader to find plugin definitions. */ private ClassLoader getDefaultClassLoader() { ClassLoader cl = null; try { cl = Thread.currentThread().getContextClassLoader(); } catch (Throwable ex) { // Cannot access thread context ClassLoader - falling back to system class loader... } if (cl == null) { // No thread context class loader -> use class loader of this class. cl = PluginResourcesResolver.class.getClassLoader(); } return cl; } }