[logback-user] JaninoEventEvaluator and class loader

ceki ceki at qos.ch
Thu Jan 5 23:47:05 CET 2012


Hi Glyn,

We started moved away from ExpressionEvaluator and started using 
ScriptEvaluator because the latter allows for java blocks whereas the 
former allows only boolean expressions. The ability to parse java blocks 
reduces the ease-of-use gap between JaninoEvaluator and GEvaluator. See 
also:
http://mailman.qos.ch/pipermail/logback-user/2011-January/002002.html

Class loading issues were not taken into consideration when making this 
change.

More in line.

On 05.01.2012 13:09, Glyn Normington wrote:
> I am attempting to get Janino 2.6.1 working with Logback 0.9.28 (or
> later, but that's the version we are using in Eclipse Virgo right now) -
> see [0] for background. Unfortunately Janino ends up using the thread
> context class loader as its "parent" class loader and fails with a
> runtime exception. I have discussed this ([1]) on the Janino mailing
> list and it seems that it is necessary to set the parent class loader in
> Janino. I am somewhat at the mercy of Logback here.

OK.

> The surprising thing is that the code in Logback 0.9.24 looked pretty
> usable in this respect. JaninoEventEvaluator.start had the following
> sequence:
>
> ClassLoader cl = context.getClass().getClassLoader();
> ee = new ExpressionEvaluator(getDecoratedExpression(), EXPRESSION_TYPE,
> getParameterNames(), getParameterTypes(), THROWN_EXCEPTIONS, cl);
>
> thus setting the parent class loader to a value which I could ensure
> would be capable of loading the necessary types.
>
> In 0.9.28 this code has been replaced by:
>
> scriptEvaluator = new ScriptEvaluator(getDecoratedExpression(),
> EXPRESSION_TYPE,
> getParameterNames(), getParameterTypes(), THROWN_EXCEPTIONS);
>
> which causes the current TCCL to be used as the parent class loader and
> ultimately results in Janino failing.

Well, as mentioned above, class loading issues were not taken into 
consideration when making the change. I was not aware that 
ScriptEvaluator used the TCCL by default.

> I can't control the TCCL that happens to be in use when start is called
> as that is driven out of a logging call which can come from an arbitrary
> thread.

Right.

> I found the relevant commit ([2]), but I can't tell from that why this
> specific change was made.

Explanation give above.

> If it is absolutely necessary to use ScriptEvaluator rather than
> ExpressionEvaluator, the following code sequence (based on a suggestion
> from Arno Unkrig) would reproduce the parent class loader behaviour of
> 0.9.24:
>
> ClassLoader cl = context.getClass().getClassLoader();
> scriptEvaluator = new ScriptEvaluator();
> scriptEvaluator.setParentClassLoader(cl);
> scriptEvaluator.setReturnType(EXPRESSION_TYPE);
> scriptEvaluator.setParameterNames(getParameterNames());
> scriptEvaluator.setParameterTypes(getParameterTypes());
> scriptEvaluator.setThrownExceptions(THROWN_EXCEPTIONS);
> scriptEvaluator.cook(getDecoratedExpression());

The above looks good to me. Please create a jira issue requesting for 
the above change. A reference to this message should provide the 
relevant context for the jira issue.

> The alternative of using ExpressionEvaluator is much neater and seems to
> be close to the ScriptEvaluator variant since ExpressionEvaluator
> extends ScriptEvaluator.

AFAIK, only ScriptEvaluator parses java blocks. ExpressionEvaluator does 
not.

> Any suggestions gratefully received.

I would not mind if in addition to the jira issue you could also apply 
and then test the approach suggested by Arno Unkrig, culminating in  git 
pull request. Yay!

> Regards,
> Glyn
> [0] https://bugs.eclipse.org/bugs/show_bug.cgi?id=333920
> [1] mailing list archive link currently broken - if I can get a link to
> it, I'll post this later
> [2]
> https://github.com/ceki/logback/commit/06a5b692f14560636bd92d7bd7cf1f85830f4e55#diff-4
>


-- 
Ceki
http://twitter.com/#!/ceki


More information about the Logback-user mailing list