fixed JPMS support

This commit is contained in:
2022-03-16 13:52:58 +08:00
parent 7001620434
commit 7ec91ed870

View File

@@ -1,7 +1,11 @@
package net.woggioni.envelope; package net.woggioni.envelope;
import java.util.Map;
import java.util.TreeMap;
import java.lang.module.Configuration; import java.lang.module.Configuration;
import java.lang.module.ModuleFinder; import java.lang.module.ModuleFinder;
import java.lang.module.ResolvedModule;
import java.lang.module.ModuleReference;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Collections; import java.util.Collections;
import java.util.Optional; import java.util.Optional;
@@ -9,9 +13,11 @@ import java.util.Optional;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import net.woggioni.xclassloader.PathClassLoader; import net.woggioni.xclassloader.PathClassLoader;
import net.woggioni.xclassloader.ModuleClassLoader;
import net.woggioni.xclassloader.PathModuleFinder; import net.woggioni.xclassloader.PathModuleFinder;
class MainClassLoader { class MainClassLoader {
@SneakyThrows @SneakyThrows
static Class<?> loadMainClass(Iterable<Path> roots, String mainModuleName, String mainClassName) { static Class<?> loadMainClass(Iterable<Path> roots, String mainModuleName, String mainClassName) {
if (mainModuleName == null) { if (mainModuleName == null) {
@@ -21,13 +27,22 @@ class MainClassLoader {
ModuleLayer bootLayer = ModuleLayer.boot(); ModuleLayer bootLayer = ModuleLayer.boot();
Configuration bootConfiguration = bootLayer.configuration(); Configuration bootConfiguration = bootLayer.configuration();
Configuration cfg = bootConfiguration.resolve(new PathModuleFinder(roots), ModuleFinder.of(), Collections.singletonList(mainModuleName)); Configuration cfg = bootConfiguration.resolve(new PathModuleFinder(roots), ModuleFinder.of(), Collections.singletonList(mainModuleName));
ClassLoader pathClassLoader = new PathClassLoader(roots, cfg, null); Map<String, ClassLoader> packageMap = new TreeMap<>();
ModuleLayer.Controller controller = ModuleLayer.Controller controller =
ModuleLayer.defineModules(cfg, Collections.singletonList(ModuleLayer.boot()), moduleName -> pathClassLoader); ModuleLayer.defineModules(cfg, Collections.singletonList(ModuleLayer.boot()), moduleName -> {
ModuleReference modRef = cfg.findModule(moduleName)
.map(ResolvedModule::reference)
.orElseThrow();
ClassLoader cl = new ModuleClassLoader(
Collections.unmodifiableMap(packageMap),
modRef
);
for(String packageName : modRef.descriptor().packages()) {
packageMap.put(packageName, cl);
}
return cl;
});
ModuleLayer layer = controller.layer(); ModuleLayer layer = controller.layer();
for(Module module : layer.modules()) {
controller.addReads(module, pathClassLoader.getUnnamedModule());
}
Module mainModule = layer.findModule(mainModuleName).orElseThrow( Module mainModule = layer.findModule(mainModuleName).orElseThrow(
() -> new IllegalStateException(String.format("Main module '%s' not found", mainModuleName))); () -> new IllegalStateException(String.format("Main module '%s' not found", mainModuleName)));
return Optional.ofNullable(mainClassName) return Optional.ofNullable(mainClassName)