Refactoring launch types

This commit is contained in:
dima_dencep 2023-07-02 11:59:49 +07:00
parent 7950eea975
commit 75410477bf
No known key found for this signature in database
GPG key ID: ED87FE0D1750A12D
5 changed files with 64 additions and 42 deletions

View file

@ -4,20 +4,23 @@
import pro.gravit.utils.PublicURLClassLoader; import pro.gravit.utils.PublicURLClassLoader;
import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.IOHelper;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType; import java.lang.invoke.MethodType;
import java.net.URL; import java.net.URL;
import java.nio.file.Paths; import java.nio.file.Paths;
public class ClasspathLaunch implements Launch { public class ClasspathLaunch implements Launch {
@Override @Override
@SuppressWarnings("ConfusingArgumentToVarargsMethod") @SuppressWarnings("ConfusingArgumentToVarargsMethod")
public void run(String mainclass, ServerWrapper.Config config, String[] args) throws Throwable { 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); URL[] urls = config.classpath.stream()
ClassLoader ucl = new PublicURLClassLoader(urls); .map(Paths::get)
Class<?> mainClass = Class.forName(mainclass, true, ucl); .map(IOHelper::toURL)
MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); .toArray(URL[]::new);
mainMethod.invoke(args);
MethodHandles.lookup()
.findStatic(Class.forName(mainClass, true, new PublicURLClassLoader(urls)), "main", MethodType.methodType(void.class, String[].class))
.invoke(args);
} }
} }

View file

@ -3,5 +3,5 @@
import pro.gravit.launcher.server.ServerWrapper; import pro.gravit.launcher.server.ServerWrapper;
public interface Launch { 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;
} }

View file

@ -3,8 +3,9 @@
import pro.gravit.launcher.server.ServerWrapper; import pro.gravit.launcher.server.ServerWrapper;
public class ModuleLaunch implements Launch { public class ModuleLaunch implements Launch {
@Override @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"); throw new UnsupportedOperationException("Module system not supported");
} }
} }

View file

@ -2,16 +2,16 @@
import pro.gravit.launcher.server.ServerWrapper; import pro.gravit.launcher.server.ServerWrapper;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType; import java.lang.invoke.MethodType;
public class SimpleLaunch implements Launch { public class SimpleLaunch implements Launch {
@Override @Override
@SuppressWarnings("ConfusingArgumentToVarargsMethod") @SuppressWarnings("ConfusingArgumentToVarargsMethod")
public void run(String mainclass, ServerWrapper.Config config, String[] args) throws Throwable { public void run(String mainClass, ServerWrapper.Config config, String[] args) throws Throwable {
Class<?> mainClass = Class.forName(mainclass); MethodHandles.lookup()
MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); .findStatic(Class.forName(mainClass), "main", MethodType.methodType(void.class, String[].class))
mainMethod.invoke(args); .invoke(args);
} }
} }

View file

@ -4,7 +4,6 @@
import pro.gravit.utils.PublicURLClassLoader; import pro.gravit.utils.PublicURLClassLoader;
import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.IOHelper;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType; import java.lang.invoke.MethodType;
import java.lang.module.Configuration; import java.lang.module.Configuration;
@ -15,55 +14,74 @@
import java.util.List; import java.util.List;
public class ModuleLaunch implements Launch { public class ModuleLaunch implements Launch {
@Override @Override
@SuppressWarnings("ConfusingArgumentToVarargsMethod") @SuppressWarnings("ConfusingArgumentToVarargsMethod")
public void run(String mainclass, ServerWrapper.Config config, String[] args) throws Throwable { 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); URL[] urls = config.classpath.stream()
ClassLoader ucl = new PublicURLClassLoader(urls); .map(Paths::get)
.map(IOHelper::toURL)
.toArray(URL[]::new);
// Create Module Layer // 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(); ModuleLayer bootLayer = ModuleLayer.boot();
Configuration configuration = bootLayer.configuration() Configuration configuration = bootLayer.configuration().resolveAndBind(ModuleFinder.of(), finder, config.moduleConf.modules);
.resolveAndBind(ModuleFinder.of(), finder, config.moduleConf.modules); ModuleLayer.Controller controller = ModuleLayer.defineModulesWithOneLoader(configuration, List.of(bootLayer), new PublicURLClassLoader(urls));
ModuleLayer.Controller controller = ModuleLayer.defineModulesWithOneLoader(configuration, List.of(bootLayer), ucl);
ModuleLayer layer = controller.layer(); ModuleLayer layer = controller.layer();
// Configure exports / opens // Configure exports / opens
for(var e : config.moduleConf.exports.entrySet()) { for (var e : config.moduleConf.exports.entrySet()) {
String[] split = e.getKey().split("\\\\"); String[] split = e.getKey().split("\\\\");
Module source = layer.findModule(split[0]).orElseThrow();
String pkg = split[1]; controller.addExports(
Module target = layer.findModule(e.getValue()).orElseThrow(); layer.findModule(split[0]).orElseThrow(),
controller.addExports(source, pkg, target); 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("\\\\"); String[] split = e.getKey().split("\\\\");
Module source = layer.findModule(split[0]).orElseThrow();
String pkg = split[1]; controller.addOpens(
Module target = layer.findModule(e.getValue()).orElseThrow(); layer.findModule(split[0]).orElseThrow(),
controller.addOpens(source, pkg, target); split[1],
layer.findModule(e.getValue()).orElseThrow()
);
} }
for(var e : config.moduleConf.reads.entrySet()) {
Module source = layer.findModule(e.getKey()).orElseThrow(); for (var e : config.moduleConf.reads.entrySet()) {
Module target = layer.findModule(e.getValue()).orElseThrow(); controller.addReads(
controller.addReads(source, target); layer.findModule(e.getKey()).orElseThrow(),
layer.findModule(e.getValue()).orElseThrow()
);
} }
Module mainModule = layer.findModule(config.moduleConf.mainModule).orElseThrow(); Module mainModule = layer.findModule(config.moduleConf.mainModule).orElseThrow();
Module unnamed = ModuleLaunch.class.getClassLoader().getUnnamedModule(); Module unnamed = ModuleLaunch.class.getClassLoader().getUnnamedModule();
if(unnamed != null) { if (unnamed != null) {
controller.addOpens(mainModule, getPackageFromClass(config.mainclass), unnamed); controller.addOpens(mainModule, getPackageFromClass(config.mainclass), unnamed);
} }
// Start main class // Start main class
ClassLoader loader = mainModule.getClassLoader(); MethodHandles.lookup()
Class<?> mainClass = Class.forName(mainclass, true, loader); .findStatic(Class.forName(mainClass, true, mainModule.getClassLoader()), "main", MethodType.methodType(void.class, String[].class))
MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); .invoke(args);
mainMethod.invoke(args);
} }
private static String getPackageFromClass(String clazz) { private static String getPackageFromClass(String clazz) {
int index = clazz.lastIndexOf("."); int index = clazz.lastIndexOf(".");
if(index >= 0) { if (index >= 0) {
return clazz.substring(0, index); return clazz.substring(0, index);
} }
return clazz; return clazz;
} }
} }