diff --git a/java/runjava/src/main/java/io/osv/ContextIsolator.java b/java/runjava/src/main/java/io/osv/ContextIsolator.java index 96e00504bb695319d077a66f4e840d482cbec1fe..19e8e200c8aba8452822c0ba498167a08b794c1a 100644 --- a/java/runjava/src/main/java/io/osv/ContextIsolator.java +++ b/java/runjava/src/main/java/io/osv/ContextIsolator.java @@ -107,7 +107,9 @@ public class ContextIsolator { runMain(loadClass(mainClass), args); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - } catch (Throwable e) { + } catch (MainClassNotFoundException e) { + context.setException(e); + } catch (Throwable e) { getUncaughtExceptionHandler().uncaughtException(this, e); } } @@ -253,8 +255,13 @@ public class ContextIsolator { return new File(path).isDirectory(); } - private static Class<?> loadClass(String name) throws ClassNotFoundException { - return Thread.currentThread().getContextClassLoader().loadClass(name); + private static Class<?> loadClass(String name) throws MainClassNotFoundException { + try { + Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(name); + return clazz; + } catch (ClassNotFoundException ex) { + throw new MainClassNotFoundException(name); + } } // Expand classpath, as given in the "-classpath" option, to a list of diff --git a/java/runjava/src/main/java/io/osv/MainClassNotFoundException.java b/java/runjava/src/main/java/io/osv/MainClassNotFoundException.java new file mode 100644 index 0000000000000000000000000000000000000000..9c57060a9cd945dbd2e52a675f4cb8b28fec3bf8 --- /dev/null +++ b/java/runjava/src/main/java/io/osv/MainClassNotFoundException.java @@ -0,0 +1,21 @@ +package io.osv; + +/* + * Copyright (C) 2014 Jaspal Singh Dhillon + * + * This work is open source software, licensed under the terms of the + * BSD license as described in the LICENSE file in the top-level directory. + */ + +public class MainClassNotFoundException extends Exception { + + private String mainClassName; + + public MainClassNotFoundException(String mainClass) { + mainClassName = mainClass; + } + + public String getClassName() { + return mainClassName; + } +} diff --git a/java/runjava/src/main/java/io/osv/RunJava.java b/java/runjava/src/main/java/io/osv/RunJava.java index 6c8c005809c60c4bbeb14fc023d7599a98b3de56..a826f24c13fb3d237f91b2e8fe91b53cb486ecd4 100644 --- a/java/runjava/src/main/java/io/osv/RunJava.java +++ b/java/runjava/src/main/java/io/osv/RunJava.java @@ -26,7 +26,13 @@ public class RunJava { ContextIsolator.getInstance().runSync(args); } catch (IllegalArgumentException ex) { System.err.println("RunJava: " + ex.getMessage()); - } catch (Throwable ex) { + } catch (ContextFailedException ex) { + if (ex.getCause() instanceof MainClassNotFoundException) { + System.err.println("Error: Could not find or load main class " + ((MainClassNotFoundException)ex.getCause()).getClassName()); + } else { + ex.printStackTrace(); + } + } catch (Throwable ex) { ex.printStackTrace(); } }