Своя Java и нестандартный запуск
Обычно версию Java выбирает сам Minecraft: 1.7.10 просит восьмую, 1.20 — семнадцатую. Но
сборки со сторонними патчами эти правила ломают — например lwjgl3ify от GTNH запускает
1.7.10 на современной Java. Для таких случаев сборке можно задать и рантайм, и аргументы, и точку
входа.
Другая версия Java
Версия задаётся при подготовке клиента ключом java:
laminara-server exec "install gtnh 1.7.10 loader=forge java=java-runtime-delta"Значения — это названия рантаймов из каталога Mojang, а не номера версий:
| Значение | Java |
|---|---|
jre-legacy | 8 |
java-runtime-alpha | 16 |
java-runtime-beta, java-runtime-gamma | 17 |
java-runtime-delta | 21 |
Указанный рантайм скачивается на сервер и попадает в сборку, поэтому игроку ничего ставить не нужно. В карточке сборки будет видна именно эта версия.
Аргументы, classpath и точка входа
Всё остальное настраивается в laminara.settings.json рядом со сборкой. Поля необязательные:
{ "jvmArgs": ["-Dfile.encoding=UTF-8", "--add-opens", "java.base/java.lang=ALL-UNNAMED"], "gameArgs": [], "classpath": ["libraries/lwjgl3ify/lwjgl3ify-3.0.32-forgePatches.jar"], "classpathExclude": ["libraries/org/lwjgl/lwjgl/lwjgl/*", "libraries/org/lwjgl/lwjgl/lwjgl_util/*"], "mainClass": "com.gtnewhorizons.retrofuturabootstrap.MainStartOnFirstThread"}jvmArgs— аргументы JVM. Парные ключи (--add-opens java.base/java.lang=ALL-UNNAMED) пишутся двумя элементами, как в файлах видаjava9args.txt, — их не нужно склеивать.gameArgs— аргументы, которые получит сама игра.classpath— пути внутри сборки, которые встанут перед обычным classpath. Именно так подключаются ранние патчи, которые обязаны загрузиться первыми.classpathExclude— что выбросить из classpath.*можно поставить один раз, в любом месте шаблона, и он захватывает всё, включая вложенные папки. Нужно, когда патч заменяет библиотеку и старая версия начинает мешать. Пишите шаблон как можно уже: LWJGL 2 лежит вorg/lwjgl/lwjgl/lwjgl/, а ядро LWJGL 3 — вorg/lwjgl/lwjgl/<версия>/, так чтоlibraries/org/lwjgl/lwjgl/*выбросило бы обе.mainClass— другая точка входа вместо той, что прописал загрузчик.
Всё это попадает в подписанный манифест, поэтому лаунчер применяет ровно то, что вы задали на сервере, и ничего на машине игрока подменить эти значения не может.
Проверить, что сборка принимает настройки, можно публикацией: она разбирает эти поля и отказывается публиковать сборку с ошибкой в них.
Пример: Forge 1.7.10 на Java 21
-
Подготовить клиент с нужным рантаймом
Окно терминала laminara-server exec "install gtnh 1.7.10 loader=forge java=java-runtime-delta"Версия загрузчика подберётся сама — для 1.7.10 это
10.13.4.1614-1.7.10. -
Положить файлы патчера
lwjgl3ify-<версия>-forgePatches.jar— вlibraries/lwjgl3ify/внутри папки платформы, сам мод иUniMixins— вmods/, библиотеки LWJGL 3 — рядом с патчером. -
Прописать запуск в
laminara.settings.jsonjvmArgs— содержимоеjava9args.txtиз релиза патчера,classpath— патчер и библиотеки LWJGL 3,classpathExclude—libraries/org/lwjgl/lwjgl/lwjgl/*иlibraries/org/lwjgl/lwjgl/lwjgl_util/*,mainClass— точка входа RetroFuturaBootstrap. -
Опубликовать
Окно терминала laminara-server exec "publish gtnh"
Когда это не нужно
Для ванильных сборок, Fabric, Quilt, Forge и NeoForge ничего этого задавать не надо — версия Java, classpath и точка входа берутся из самой версии Minecraft и загрузчика. Эти настройки существуют ради сборок, которые сознательно отходят от стандартной схемы запуска.