package com.jsonde.agent; import java.io.IOException; import java.net.*; import java.util.LinkedList; import java.util.List; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; import java.util.regex.Pattern; public class ResolveAgentLibrariesClassLoader extends URLClassLoader { private static String jSondeLibrariesRegexp; public ResolveAgentLibrariesClassLoader() { super(getUrls(), null); } private static URL[] getUrls() { try { URL agentJarLocation = ResolveAgentLibrariesClassLoader.class.getProtectionDomain().getCodeSource().getLocation(); URI agentJarURI = agentJarLocation.toURI(); JarFile agentJarFile = new JarFile(agentJarURI.getPath()); Manifest agentManifest = agentJarFile.getManifest(); Attributes agentManifestAttributes = agentManifest.getMainAttributes(); String jSondeClassPath = agentManifestAttributes.getValue("JSonde-Class-Path"); jSondeLibrariesRegexp = agentManifestAttributes.getValue("JSonde-Libraries-Regexp"); List<URL> urls = new LinkedList<URL>(); for (String jar : jSondeClassPath.split("\\s")) { try { URL o = new URL(agentJarLocation, jar); urls.add(o); } catch (MalformedURLException e) { e.printStackTrace(); } } return urls.toArray(new URL[urls.size()]); } catch (IOException e) { e.printStackTrace(); return new URL[]{}; } catch (URISyntaxException e) { e.printStackTrace(); return new URL[]{}; } } @Override public Class<?> findClass(String name) throws ClassNotFoundException { if (Pattern.matches(jSondeLibrariesRegexp, name)) { return super.findClass(name); } else { return findSystemClass(name); } } }