mirror of
https://github.com/GravitLauncher/Launcher
synced 2025-04-01 22:14:01 +03:00
Refactoring launch types
This commit is contained in:
parent
7950eea975
commit
75410477bf
5 changed files with 64 additions and 42 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue