> On 26 Feb 2017, at 13:26, Doug Simon <doug.si...@oracle.com> wrote: > >> >> On 26 Feb 2017, at 13:22, Doug Simon <doug.si...@oracle.com> wrote: >> >>> >>> On 26 Feb 2017, at 13:08, Alan Bateman <alan.bate...@oracle.com> wrote: >>> >>> On 26/02/2017 11:20, Doug Simon wrote: >>> >>>> While trying to get upstream Graal working again with JDK 9, I'm having >>>> problems with service loading. Graal uses a LayoutFactory service defined >>>> by Truffle where the latter also includes a provider. The relevant parts >>>> of the module-info descriptors are: >>>> >>>> module com.oracle.truffle.truffle_api { >>>> >>>> exports com.oracle.truffle.object; >>>> exports com.oracle.truffle.object.basic; >>>> >>>> uses com.oracle.truffle.api.object.LayoutFactory; >>>> provides com.oracle.truffle.api.object.LayoutFactory with >>>> com.oracle.truffle.object.basic.DefaultLayoutFactory; >>>> >>>> } >>>> >>>> module jdk.internal.vm.compiler { >>>> requires transitive com.oracle.truffle.truffle_api; >>>> uses com.oracle.truffle.api.object.LayoutFactory; >>>> >>>> } >>>> >>>> However, looking up a provider in Graal[1] returns no providers. As far as >>>> I understand service loading with modules, this is because >>>> jdk.internal.vm.compiler is loaded via the platform class loader while >>>> truffle is loaded via the app class loader as shown by the output of trace >>>> statements I added: >>>> >>>> GraalTruffleRuntime.class.getClassLoader() -> >>>> jdk.internal.loader.ClassLoaders$PlatformClassLoader@366e2eef >>>> LayoutFactory.class.getClassLoader() -> >>>> jdk.internal.loader.ClassLoaders$AppClassLoader@6df97b55 >>>> >>>> This ability of a platform loaded class to depend on an app loaded class >>>> is probably due to the soon-to-be-disabled mechanism[2] we use for >>>> overriding the version of Graal bundled with JDK 9. >>>> >>>> Is there some command line magic I can use to make this case work now or >>>> do I have to wait until [2] is addressed? If the latter, how will it work >>>> then? >>>> >>> An upgraded moduledefined to the platform loader can link to types in >>> modules defined to the app loader. So I wouldn't expect issues there. >>> >>> Can you track down the code that uses ServiceLoader.load to load the >>> LayoutFactory providers? >> >> The code is in the first link of my previous message: >> >> https://github.com/graalvm/graal-core/blob/1efc1c543acd7ed447c59788aeabc223be13e774/graal/org.graalvm.compiler.truffle/src/org/graalvm/compiler/truffle/GraalTruffleRuntime.java#L693 >> >>> It might be using loadInstalled or invoking it with the platform class >>> loader and that would explain what you are seeing. >> >> Thanks - using LayoutFactory.class.getClassLoader() works. So the general >> rule is to use the leaf most class loader the service client knows about? > > If that's the case, does that mean I could pick up any provider on the app > class path? Seems a little risky. Is there some way to confine it to modules > the service user trusts (by virtual of being a module in its dependency > graph)?
Also, what if there's provider in jdk.internal.vm.compiler itself? Will it be loaded along with the providers on my module path? -Doug