package org.cyclopsgroup.jmxterm.pm; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.security.AccessController; import java.security.PrivilegedAction; import org.apache.commons.lang.SystemUtils; /** * Utility to get class loader that understands tools.jar and jconsole.jar * * @author <a href="mailto:jiaqi.guo@gmail.com">Jiaqi Guo</a> */ public class JConsoleClassLoaderFactory { private JConsoleClassLoaderFactory() { } /** * @return ClassLoader that understands tools.jar and jconsole.jar */ public static ClassLoader getClassLoader() { File javaHome = new File( SystemUtils.JAVA_HOME ).getAbsoluteFile().getParentFile(); final File toolsJar, jconsoleJar; if (isBeforeJava7() && isMacOs()) { toolsJar = new File( javaHome, "Classes/classes.jar" ); jconsoleJar = new File( javaHome, "Classes/jconsole.jar" ); } else { toolsJar = new File( javaHome, "lib/tools.jar" ); jconsoleJar = new File( javaHome, "lib/jconsole.jar" ); } if ( !toolsJar.isFile() ) { throw new RuntimeException( "Operation requires JDK instead of JRE" ); } if ( !jconsoleJar.isFile() ) { throw new RuntimeException( jconsoleJar + " file is not found" ); } // Parent class loader has to be bootstrap class loader instead of current one return AccessController.doPrivileged( new PrivilegedAction<ClassLoader>() { public ClassLoader run() { try { return new URLClassLoader( new URL[] { toolsJar.toURI().toURL(), jconsoleJar.toURI().toURL() }, String.class.getClassLoader() ); } catch ( MalformedURLException e ) { throw new RuntimeException( "Couddn't convert files to URLs " + toolsJar + ", " + jconsoleJar + ": " + e.getMessage(), e ); } } } ); } private static boolean isBeforeJava7() { return SystemUtils.IS_JAVA_1_5 || SystemUtils.IS_JAVA_1_6; } private static boolean isMacOs() { return SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_MAC_OSX; } }