From 96996da2f6ad26bbec9a246c6e66604d7411c76c Mon Sep 17 00:00:00 2001 From: Jaspal Singh Dhillon <jaspal.iiith@gmail.com> Date: Mon, 19 May 2014 13:42:36 +0530 Subject: [PATCH] java: Don't throw exceptions at user when the main class is not found Fixes https://github.com/cloudius-systems/mgmt/issues/33 If a user runs 'java xyz', instead of throwing the stacktrace, a simple message informing the user about the missing class, should suffice. Signed-off-by: Jaspal Singh Dhillon <jaspal.iiith@gmail.com> Reviewed-by: Tomasz Grabiec <tgrabiec@gmail.com> Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com> --- .../src/main/java/io/osv/ContextIsolator.java | 13 +++++++++--- .../io/osv/MainClassNotFoundException.java | 21 +++++++++++++++++++ .../runjava/src/main/java/io/osv/RunJava.java | 8 ++++++- 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 java/runjava/src/main/java/io/osv/MainClassNotFoundException.java diff --git a/java/runjava/src/main/java/io/osv/ContextIsolator.java b/java/runjava/src/main/java/io/osv/ContextIsolator.java index 96e00504b..19e8e200c 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 000000000..9c57060a9 --- /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 6c8c00580..a826f24c1 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(); } } -- GitLab