On 05/23/18 19:04, Alan Bateman wrote:
On 23/05/2018 16:39, Peter Levart wrote:

I thought so. This is what debugger told be me about TCCL (debugger calls .toString() on it by default):

ClassRealm[plugin>com.marand.misc:misc-mojo-git:1.24, parent: jdk.internal.loader.ClassLoaders$AppClassLoader@1de0aca6]

But now that you asked specifically, I also checked the instance and evaluated .getParent() on it and got null ?! toString is a damn liar!

It seems that Maven class loaders don't follow standard delegation model and so JDK can't climb the chain. Sorry for not checking this before. There's nothing JDK can do about it, I belive.
Which Maven plugin is this and is the latest version? The work to get Maven working with JDK 9 got started in 2015 so I'm surprised that there are still issues.

It's not an official plugin. And it seems that the Maven container is to blame, not the plugin. The nonstandard ClassLoader is supplied by the container. The plugin just uses the most direct and default API possible to instantiate JavaScript engine:

jsEngine = new ScriptEngineManager().getEngineByName("JavaScript");

It is the environment the plugin is executing in that doesn't play well with how system service providers are located from JDK 9 on - namely, the nonstandard ClassLoader that delegates to system class loader, but does not express this also in the .getParent() result. I don't know why Maven choose this, but closer inspection reveals that its ClassLoader does have a "parent", but it keeps it in its own field called "parentClassLoader" and doesn't return it from .getParent(). There must be a reason for this, but I don't know that it is.

Do other parts of the JDK also use TCCL to bootstrap service lookup by default? Isn't it unusual that ScriptEngineManager uses TCCL by default?

Regards, Peter



-Alan

Reply via email to