diff --git a/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/ClasspathLaunch.java b/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/ClasspathLaunch.java index 554ca32f..4071ab1b 100644 --- a/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/ClasspathLaunch.java +++ b/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/ClasspathLaunch.java @@ -4,20 +4,23 @@ import pro.gravit.utils.PublicURLClassLoader; import pro.gravit.utils.helper.IOHelper; -import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.net.URL; import java.nio.file.Paths; public class ClasspathLaunch implements Launch { + @Override @SuppressWarnings("ConfusingArgumentToVarargsMethod") - public void run(String mainclass, ServerWrapper.Config config, String[] args) throws Throwable { - URL[] urls = config.classpath.stream().map(Paths::get).map(IOHelper::toURL).toArray(URL[]::new); - ClassLoader ucl = new PublicURLClassLoader(urls); - Class mainClass = Class.forName(mainclass, true, ucl); - MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); - mainMethod.invoke(args); + public void run(String mainClass, ServerWrapper.Config config, String[] args) throws Throwable { + URL[] urls = config.classpath.stream() + .map(Paths::get) + .map(IOHelper::toURL) + .toArray(URL[]::new); + + MethodHandles.lookup() + .findStatic(Class.forName(mainClass, true, new PublicURLClassLoader(urls)), "main", MethodType.methodType(void.class, String[].class)) + .invoke(args); } } diff --git a/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/Launch.java b/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/Launch.java index f4e915e8..95f3c91c 100644 --- a/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/Launch.java +++ b/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/Launch.java @@ -3,5 +3,5 @@ import pro.gravit.launcher.server.ServerWrapper; public interface Launch { - void run(String mainclass, ServerWrapper.Config config, String[] args) throws Throwable; + void run(String mainClass, ServerWrapper.Config config, String[] args) throws Throwable; } diff --git a/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/ModuleLaunch.java b/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/ModuleLaunch.java index b0e8102e..d8a520cd 100644 --- a/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/ModuleLaunch.java +++ b/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/ModuleLaunch.java @@ -3,8 +3,9 @@ import pro.gravit.launcher.server.ServerWrapper; public class ModuleLaunch implements Launch { + @Override - public void run(String mainclass, ServerWrapper.Config config, String[] args) { + public void run(String mainClass, ServerWrapper.Config config, String[] args) { throw new UnsupportedOperationException("Module system not supported"); } } diff --git a/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/SimpleLaunch.java b/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/SimpleLaunch.java index 8b2b6df7..466a1567 100644 --- a/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/SimpleLaunch.java +++ b/ServerWrapper/src/main/java/pro/gravit/launcher/server/launch/SimpleLaunch.java @@ -2,16 +2,16 @@ import pro.gravit.launcher.server.ServerWrapper; -import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; public class SimpleLaunch implements Launch { + @Override @SuppressWarnings("ConfusingArgumentToVarargsMethod") - public void run(String mainclass, ServerWrapper.Config config, String[] args) throws Throwable { - Class mainClass = Class.forName(mainclass); - MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); - mainMethod.invoke(args); + public void run(String mainClass, ServerWrapper.Config config, String[] args) throws Throwable { + MethodHandles.lookup() + .findStatic(Class.forName(mainClass), "main", MethodType.methodType(void.class, String[].class)) + .invoke(args); } } diff --git a/ServerWrapper/src/main/java11/pro/gravit/launcher/server/launch/ModuleLaunch.java b/ServerWrapper/src/main/java11/pro/gravit/launcher/server/launch/ModuleLaunch.java index 53cbfa7a..225b2d87 100644 --- a/ServerWrapper/src/main/java11/pro/gravit/launcher/server/launch/ModuleLaunch.java +++ b/ServerWrapper/src/main/java11/pro/gravit/launcher/server/launch/ModuleLaunch.java @@ -4,7 +4,6 @@ import pro.gravit.utils.PublicURLClassLoader; import pro.gravit.utils.helper.IOHelper; -import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.lang.module.Configuration; @@ -15,55 +14,74 @@ import java.util.List; public class ModuleLaunch implements Launch { + @Override @SuppressWarnings("ConfusingArgumentToVarargsMethod") - public void run(String mainclass, ServerWrapper.Config config, String[] args) throws Throwable { - URL[] urls = config.classpath.stream().map(Paths::get).map(IOHelper::toURL).toArray(URL[]::new); - ClassLoader ucl = new PublicURLClassLoader(urls); + public void run(String mainClass, ServerWrapper.Config config, String[] args) throws Throwable { + URL[] urls = config.classpath.stream() + .map(Paths::get) + .map(IOHelper::toURL) + .toArray(URL[]::new); + + // Create Module Layer - ModuleFinder finder = ModuleFinder.of(config.moduleConf.modulePath.stream().map(Paths::get).toArray(Path[]::new)); + ModuleFinder finder = ModuleFinder.of(config.moduleConf.modulePath.stream() + .map(Paths::get) + .toArray(Path[]::new) + ); + ModuleLayer bootLayer = ModuleLayer.boot(); - Configuration configuration = bootLayer.configuration() - .resolveAndBind(ModuleFinder.of(), finder, config.moduleConf.modules); - ModuleLayer.Controller controller = ModuleLayer.defineModulesWithOneLoader(configuration, List.of(bootLayer), ucl); + Configuration configuration = bootLayer.configuration().resolveAndBind(ModuleFinder.of(), finder, config.moduleConf.modules); + ModuleLayer.Controller controller = ModuleLayer.defineModulesWithOneLoader(configuration, List.of(bootLayer), new PublicURLClassLoader(urls)); ModuleLayer layer = controller.layer(); + // Configure exports / opens - for(var e : config.moduleConf.exports.entrySet()) { + for (var e : config.moduleConf.exports.entrySet()) { String[] split = e.getKey().split("\\\\"); - Module source = layer.findModule(split[0]).orElseThrow(); - String pkg = split[1]; - Module target = layer.findModule(e.getValue()).orElseThrow(); - controller.addExports(source, pkg, target); + + controller.addExports( + layer.findModule(split[0]).orElseThrow(), + split[1], + layer.findModule(e.getValue()).orElseThrow() + ); } - for(var e : config.moduleConf.opens.entrySet()) { + + for (var e : config.moduleConf.opens.entrySet()) { String[] split = e.getKey().split("\\\\"); - Module source = layer.findModule(split[0]).orElseThrow(); - String pkg = split[1]; - Module target = layer.findModule(e.getValue()).orElseThrow(); - controller.addOpens(source, pkg, target); + + controller.addOpens( + layer.findModule(split[0]).orElseThrow(), + split[1], + layer.findModule(e.getValue()).orElseThrow() + ); } - for(var e : config.moduleConf.reads.entrySet()) { - Module source = layer.findModule(e.getKey()).orElseThrow(); - Module target = layer.findModule(e.getValue()).orElseThrow(); - controller.addReads(source, target); + + for (var e : config.moduleConf.reads.entrySet()) { + controller.addReads( + layer.findModule(e.getKey()).orElseThrow(), + layer.findModule(e.getValue()).orElseThrow() + ); } + Module mainModule = layer.findModule(config.moduleConf.mainModule).orElseThrow(); + Module unnamed = ModuleLaunch.class.getClassLoader().getUnnamedModule(); - if(unnamed != null) { + if (unnamed != null) { controller.addOpens(mainModule, getPackageFromClass(config.mainclass), unnamed); } + // Start main class - ClassLoader loader = mainModule.getClassLoader(); - Class mainClass = Class.forName(mainclass, true, loader); - MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); - mainMethod.invoke(args); + MethodHandles.lookup() + .findStatic(Class.forName(mainClass, true, mainModule.getClassLoader()), "main", MethodType.methodType(void.class, String[].class)) + .invoke(args); } private static String getPackageFromClass(String clazz) { int index = clazz.lastIndexOf("."); - if(index >= 0) { + if (index >= 0) { return clazz.substring(0, index); } + return clazz; } }