mirror of
https://github.com/GravitLauncher/Launcher
synced 2025-04-01 22:14:01 +03:00
parent
7e13fd3d38
commit
3c134d5652
5 changed files with 42 additions and 64 deletions
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue