使用Jamaica VM的时候 无法运行时刻通过-cp加载额外的Jar,这个代码可以完成此功能。
原帖在此
http://stackoverflow.com/questions/60764/how-should-i-load-jars-dynamically-at-runtime
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
/**
* Useful class for dynamically changing the classpath, adding classes during runtime.
*/
public class ClasspathHacker {
/**
* Parameters of the method to add an URL to the System classes.
*/
private static final Class<?>[] parameters = new Class[]{URL.class};
/**
* Adds a file to the classpath.
* @param s a String pointing to the file
* @throws IOException
*/
public static void addFile(String s) throws IOException {
File f = new File(s);
addFile(f);
}
/**
* Adds a file to the classpath
* @param f the file to be added
* @throws IOException
*/
public static void addFile(File f) throws IOException {
addURL(f.toURI().toURL());
}
/**
* Adds the content pointed by the URL to the classpath.
* @param u the URL pointing to the content to be added
* @throws IOException
*/
public static void addURL(URL u) throws IOException {
URLClassLoader sysloader = (URLClassLoader)ClassLoader.getSystemClassLoader();
Class<?> sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL",parameters);
method.setAccessible(true);
method.invoke(sysloader,new Object[]{ u });
} catch (Throwable t) {
t.printStackTrace();
throw new IOException("Error, could not add URL to system classloader");
}
}
public static void main(String args[]) throws IOException, SecurityException, ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
printClassPath();
System.out.println(null == ClasspathHacker.class.getResourceAsStream("/search/admin.xml"));
addFile("./lib/entity-search-embedded-data.jar");
printClassPath();
System.out.println(null == ClasspathHacker.class.getResourceAsStream("/search/admin.xml"));
}
public static void printClassPath() {
ClassLoader loader = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader) loader).getURLs();
for (URL url: urls) {
System.out.println(url.getFile());
}
}
}
output
/Users/jhren/Documents/Java/ClassLoaderTestProject/bin/
true
/Users/Documents/Java/ClassLoaderTestProject/bin/
/Users/Documents/Java/ClassLoaderTestProject/./lib/entity-search-embedded-data.jar
false