On 02/12/2015 15:24, Stephane Epardaud wrote:
Hi,
I have a modular jar produced by Java 9 EA + Jigsaw, I can run it with
"java -mp mlib -m my.module", but how can I run it programmatically in Java?
ATM I'm using URLClassLoader to load it and run it, but I _think_ it
does not make it "modular" and the module package visibility checks are
turned off.
What should I be looking at to load this module at runtime and run it as
a Java module?
Below is a code fragment to get you started. It assumes a collection of
modules in a directory and you know the name of the main/initial module.
It creates a Configuration by resolving that module by name. That module
might have dependences on other modules in the directory, maybe
dependences on modules in what we call the boot layer. This code
fragments use ModuleClassLoader, that might go away as it's not really
needed. Anyway, might get you started.
-Alan
Path dir = ...
String moduleName = ...
ModuleFinder finder = ModuleFinder.of(dir);
Configuration cf = Configuration.resolve(finder,
Layer.boot().configuration(),
ModuleFinder.empty(),
moduleName);
ModuleClassLoader loader = new ModuleClassLoader(cf);
Layer layer = Layer.create(cf, Layer.boot(), mn -> loader);
Optional<Module> om = layer.findModule(moduleName);
Module mainModule = om.get();
Optional<String> omc = mainModule.getDescriptor().mainClass();
String mainClass = omc.get();
Class<?> c = mainModule.getClassLoader().loadClass(mainClass);