From 2f7152cef722ba20d84442aea03089baa3cbbee8 Mon Sep 17 00:00:00 2001 From: Fabio Tudone Date: Fri, 21 Apr 2017 04:54:49 +0300 Subject: [PATCH] Let parent classloader be configurable (e.g. allows running in app servers) --- src/javarepl/EvaluationClassLoader.java | 10 +++++++--- src/javarepl/console/SimpleConsole.java | 12 +++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/javarepl/EvaluationClassLoader.java b/src/javarepl/EvaluationClassLoader.java index 32df4e8..5c0135d 100644 --- a/src/javarepl/EvaluationClassLoader.java +++ b/src/javarepl/EvaluationClassLoader.java @@ -11,12 +11,16 @@ public class EvaluationClassLoader extends URLClassLoader { private Sequence registeredUrls = sequence(); - private EvaluationClassLoader(EvaluationContext context) { - super(new URL[]{toURL().apply(context.outputDirectory())}); + private EvaluationClassLoader(EvaluationContext context, ClassLoader parentCL) { + super(new URL[]{toURL().apply(context.outputDirectory())}, parentCL); + } + + public static EvaluationClassLoader evaluationClassLoader(EvaluationContext context, ClassLoader parentCL) { + return new EvaluationClassLoader(context, parentCL); } public static EvaluationClassLoader evaluationClassLoader(EvaluationContext context) { - return new EvaluationClassLoader(context); + return new EvaluationClassLoader(context, context.getClass().getClassLoader()); } public void registerURL(URL url) { diff --git a/src/javarepl/console/SimpleConsole.java b/src/javarepl/console/SimpleConsole.java index 6dc253c..0f06570 100644 --- a/src/javarepl/console/SimpleConsole.java +++ b/src/javarepl/console/SimpleConsole.java @@ -31,14 +31,19 @@ import static javarepl.rendering.EvaluationClassRenderer.renderExpressionClass; import static javarepl.rendering.ExpressionTokenRenderer.EXPRESSION_TOKEN; -public final class SimpleConsole implements Console { +public class SimpleConsole implements Console { private final Container context; private ConsoleStatus status = Idle; public SimpleConsole(ConsoleConfig config) { + this(config, null); + } + + public SimpleConsole(ConsoleConfig config, ClassLoader parentCL) { registerShutdownHook(); context = new SimpleContainer(); + context.addInstance(ClassLoader.class, parentCL != null ? parentCL : getDefaultClassLoader(config, context)); context.addInstance(Container.class, context); context.addInstance(Console.class, this); context.addInstance(ConsoleHistory.class, historyFromFile(startsWith(":h!").or(blank()), config.historyFile)); @@ -62,6 +67,11 @@ public SimpleConsole(ConsoleConfig config) { context.get(Evaluator.class).addResults(config.results); } + protected ClassLoader getDefaultClassLoader(ConsoleConfig config, Container context) + { + return context.getClass().getClassLoader(); + } + public ConsoleResult execute(String expression) { context.get(ConsoleHistory.class).add(expression); return executeExpression(expression);