Revert "Refactoring launch types"

This reverts commit 75410477bf.
This commit is contained in:
dima_dencep 2023-07-02 13:48:13 +07:00
parent 7e13fd3d38
commit 3c134d5652
No known key found for this signature in database
GPG key ID: ED87FE0D1750A12D
5 changed files with 42 additions and 64 deletions

View file

@ -4,23 +4,20 @@
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() URL[] urls = config.classpath.stream().map(Paths::get).map(IOHelper::toURL).toArray(URL[]::new);
.map(Paths::get) ClassLoader ucl = new PublicURLClassLoader(urls);
.map(IOHelper::toURL) Class<?> mainClass = Class.forName(mainclass, true, ucl);
.toArray(URL[]::new); MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class));
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,9 +3,8 @@
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 {
MethodHandles.lookup() Class<?> mainClass = Class.forName(mainclass);
.findStatic(Class.forName(mainClass), "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);
} }
} }

View file

@ -4,6 +4,7 @@
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;
@ -14,74 +15,55 @@
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() URL[] urls = config.classpath.stream().map(Paths::get).map(IOHelper::toURL).toArray(URL[]::new);
.map(Paths::get) ClassLoader ucl = new PublicURLClassLoader(urls);
.map(IOHelper::toURL)
.toArray(URL[]::new);
// Create Module Layer // Create Module Layer
ModuleFinder finder = ModuleFinder.of(config.moduleConf.modulePath.stream() ModuleFinder finder = ModuleFinder.of(config.moduleConf.modulePath.stream().map(Paths::get).toArray(Path[]::new));
.map(Paths::get)
.toArray(Path[]::new)
);
ModuleLayer bootLayer = ModuleLayer.boot(); ModuleLayer bootLayer = ModuleLayer.boot();
Configuration configuration = bootLayer.configuration().resolveAndBind(ModuleFinder.of(), finder, config.moduleConf.modules); Configuration configuration = bootLayer.configuration()
ModuleLayer.Controller controller = ModuleLayer.defineModulesWithOneLoader(configuration, List.of(bootLayer), new PublicURLClassLoader(urls)); .resolveAndBind(ModuleFinder.of(), finder, config.moduleConf.modules);
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();
controller.addExports( String pkg = split[1];
layer.findModule(split[0]).orElseThrow(), Module target = layer.findModule(e.getValue()).orElseThrow();
split[1], controller.addExports(source, pkg, target);
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();
controller.addOpens( String pkg = split[1];
layer.findModule(split[0]).orElseThrow(), Module target = layer.findModule(e.getValue()).orElseThrow();
split[1], controller.addOpens(source, pkg, target);
layer.findModule(e.getValue()).orElseThrow()
);
} }
for(var e : config.moduleConf.reads.entrySet()) {
for (var e : config.moduleConf.reads.entrySet()) { Module source = layer.findModule(e.getKey()).orElseThrow();
controller.addReads( Module target = layer.findModule(e.getValue()).orElseThrow();
layer.findModule(e.getKey()).orElseThrow(), controller.addReads(source, target);
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
MethodHandles.lookup() ClassLoader loader = mainModule.getClassLoader();
.findStatic(Class.forName(mainClass, true, mainModule.getClassLoader()), "main", MethodType.methodType(void.class, String[].class)) Class<?> mainClass = Class.forName(mainclass, true, loader);
.invoke(args); MethodHandle mainMethod = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class));
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;
} }
} }