> 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? -Doug