80 lines
3.2 KiB
Java
80 lines
3.2 KiB
Java
package pro.gravit.launchserver;
|
|
|
|
import pro.gravit.utils.helper.IOHelper;
|
|
import pro.gravit.utils.launch.ClassLoaderControl;
|
|
import pro.gravit.utils.launch.LaunchOptions;
|
|
import pro.gravit.utils.launch.ModuleLaunch;
|
|
|
|
import java.io.FileNotFoundException;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.nio.file.FileVisitOption;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
import java.util.stream.Stream;
|
|
|
|
public class Main {
|
|
private static final List<String> classpathOnly = List.of("proguard", "jline", "kotlin", "epoll");
|
|
private static final String LOG4J_PROPERTY = "log4j2.configurationFile";
|
|
private static boolean isClasspathOnly(Path path) {
|
|
var fileName = path.getFileName().toString();
|
|
for(var e : classpathOnly) {
|
|
if(fileName.contains(e)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private static void unpackLog4j() {
|
|
String log4jConfigurationFile = System.getProperty(LOG4J_PROPERTY);
|
|
if(log4jConfigurationFile == null) {
|
|
Path log4jConfigPath = Path.of("log4j2.xml");
|
|
if(!Files.exists(log4jConfigPath)) {
|
|
try(FileOutputStream output = new FileOutputStream(log4jConfigPath.toFile())) {
|
|
try(InputStream input = Main.class.getResourceAsStream("log4j2.xml")) {
|
|
if(input == null) {
|
|
return;
|
|
}
|
|
input.transferTo(output);
|
|
}
|
|
} catch (IOException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
System.setProperty(LOG4J_PROPERTY, log4jConfigPath.toAbsolutePath().toString());
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) throws Throwable {
|
|
unpackLog4j();
|
|
ModuleLaunch launch = new ModuleLaunch();
|
|
LaunchOptions options = new LaunchOptions();
|
|
options.disablePackageDelegateSupport = true;
|
|
options.moduleConf = new LaunchOptions.ModuleConf();
|
|
List<Path> libraries;
|
|
try(Stream<Path> files = Files.walk(Path.of("libraries"), FileVisitOption.FOLLOW_LINKS)) {
|
|
libraries = new ArrayList<>(files.filter(e -> e.getFileName().toString().endsWith(".jar")).toList());
|
|
}
|
|
List<Path> classpath = new ArrayList<>();
|
|
List<String> modulepath = new ArrayList<>();
|
|
for(var l : libraries) {
|
|
if(isClasspathOnly(l)) {
|
|
classpath.add(l);
|
|
} else {
|
|
modulepath.add(l.toAbsolutePath().toString());
|
|
}
|
|
}
|
|
classpath.add(IOHelper.getCodeSource(LaunchServerStarter.class));
|
|
options.moduleConf.modulePath.addAll(modulepath);
|
|
options.moduleConf.modules.add("ALL-MODULE-PATH");
|
|
ClassLoaderControl control = launch.init(classpath, "natives", options);
|
|
ModuleLayer.Controller controller = (ModuleLayer.Controller) control.getJava9ModuleController();
|
|
launch.launch("pro.gravit.launchserver.LaunchServerStarter", null, Arrays.asList(args));
|
|
}
|
|
}
|