Print preloader results even if the underlying code called System.exit()

This commit is contained in:
Andrey Breslav
2013-11-01 16:45:49 +04:00
parent dfef1a37ac
commit 2888a6d950
@@ -34,33 +34,37 @@ public class Preloader {
} }
String modeStr = args[3]; String modeStr = args[3];
Mode mode = parseMode(modeStr); final Mode mode = parseMode(modeStr);
URL[] instrumentersClasspath = parseInstrumentersClasspath(mode, modeStr); URL[] instrumentersClasspath = parseInstrumentersClasspath(mode, modeStr);
long startTime = System.nanoTime(); final long startTime = System.nanoTime();
ClassLoader parent = Preloader.class.getClassLoader(); ClassLoader parent = Preloader.class.getClassLoader();
ClassLoader withInstrumenter = instrumentersClasspath.length > 0 ? new URLClassLoader(instrumentersClasspath, parent) : parent; ClassLoader withInstrumenter = instrumentersClasspath.length > 0 ? new URLClassLoader(instrumentersClasspath, parent) : parent;
Handler handler = getHandler(mode, withInstrumenter); final Handler handler = getHandler(mode, withInstrumenter);
ClassLoader preloaded = ClassPreloadingUtils.preloadClasses(files, classNumber, withInstrumenter, handler); ClassLoader preloaded = ClassPreloadingUtils.preloadClasses(files, classNumber, withInstrumenter, handler);
Class<?> mainClass = preloaded.loadClass(mainClassCanonicalName); Class<?> mainClass = preloaded.loadClass(mainClassCanonicalName);
Method mainMethod = mainClass.getMethod("main", String[].class); Method mainMethod = mainClass.getMethod("main", String[].class);
try { Runtime.getRuntime().addShutdownHook(
mainMethod.invoke(0, new Object[] {Arrays.copyOfRange(args, PRELOADER_ARG_COUNT, args.length)}); new Thread(new Runnable() {
} @Override
finally { public void run() {
if (mode != Mode.NO_TIME) { if (mode != Mode.NO_TIME) {
System.out.println(); System.out.println();
System.out.println("=== Preloader's measurements: "); System.out.println("=== Preloader's measurements: ");
long dt = System.nanoTime() - startTime; long dt = System.nanoTime() - startTime;
System.out.format("Total time: %.3fs\n", dt / 1e9); System.out.format("Total time: %.3fs\n", dt / 1e9);
} }
handler.done(); handler.done();
} }
})
);
mainMethod.invoke(0, new Object[] {Arrays.copyOfRange(args, PRELOADER_ARG_COUNT, args.length)});
} }
private static URL[] parseInstrumentersClasspath(Mode mode, String modeStr) private static URL[] parseInstrumentersClasspath(Mode mode, String modeStr)