Перейти к содержимому

Своя 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-legacy8
java-runtime-alpha16
java-runtime-beta, java-runtime-gamma17
java-runtime-delta21

Указанный рантайм скачивается на сервер и попадает в сборку, поэтому игроку ничего ставить не нужно. В карточке сборки будет видна именно эта версия.

Аргументы, 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

  1. Подготовить клиент с нужным рантаймом

    Окно терминала
    laminara-server exec "install gtnh 1.7.10 loader=forge java=java-runtime-delta"

    Версия загрузчика подберётся сама — для 1.7.10 это 10.13.4.1614-1.7.10.

  2. Положить файлы патчера

    lwjgl3ify-<версия>-forgePatches.jar — в libraries/lwjgl3ify/ внутри папки платформы, сам мод и UniMixins — в mods/, библиотеки LWJGL 3 — рядом с патчером.

  3. Прописать запуск в laminara.settings.json

    jvmArgs — содержимое java9args.txt из релиза патчера, classpath — патчер и библиотеки LWJGL 3, classpathExclude — libraries/org/lwjgl/lwjgl/lwjgl/* и libraries/org/lwjgl/lwjgl/lwjgl_util/*, mainClass — точка входа RetroFuturaBootstrap.

  4. Опубликовать

    Окно терминала
    laminara-server exec "publish gtnh"

Когда это не нужно

Для ванильных сборок, Fabric, Quilt, Forge и NeoForge ничего этого задавать не надо — версия Java, classpath и точка входа берутся из самой версии Minecraft и загрузчика. Эти настройки существуют ради сборок, которые сознательно отходят от стандартной схемы запуска.