import java.io.File; import java.lang.reflect.Method; import java.net.*; import java.util.*; import java.util.Set; public class Starter { public static void main(String[] args) { try { new Starter(args); } catch (Throwable e) { e.printStackTrace(); System.exit(1); } } public static class StartClassLoader extends URLClassLoader { Set files = Collections.synchronizedSet(new LinkedHashSet()); public StartClassLoader() { super(new URL[0]); } public StartClassLoader(ClassLoader parent) { super(new URL[0], parent); } public boolean addFile(File f) throws MalformedURLException { if (!files.add(f)) return false; addURL(f.toURI().toURL()); return true; } } Starter(String[] args) throws Exception { Class c = getClass(); File jar = new File(c.getProtectionDomain().getCodeSource().getLocation().toURI()); System.out.println("Starter Jar: " + jar.getAbsolutePath()); StartClassLoader startClassLoader = new StartClassLoader(/*c.getClassLoader()*/); startClassLoader.addFile(jar); Class mainClass = startClassLoader.loadClass("main"); Method mainMethod = c.getDeclaredMethod("main", String[].class); mainMethod.invoke(null, new Object[] {args}); } }