Relauncher: умный перезапуск JVM для Minecraft
Каждый опытный игрок в Minecraft знает, как сильно на производительность и стабильность влияют аргументы виртуальной машины Java. Тонкая настройка сборщика мусора, выделение памяти, системные свойства — всё это обычно требует вмешательства в параметры лаунчера. Но что, если мод сам мог бы перезапустить игру с нужными флагами, причём незаметно для пользователя? Именно эту задачу решает Relauncher — крошечная, но невероятно мощная библиотека, которая работает практически на всех версиях игры, начиная с древней 1.6.4 и заканчивая самыми свежими сборками.
Зачем нужен перезапуск JVM в Minecraft
Представьте: вы собрали сложный модпак, но часть модов требует особых настроек Java, которые неудобно прописывать в каждом лаунчере отдельно. Или ваш мод должен динамически подгрузить javaagent после установки зависимостей. Relauncher делает перезапуск процесса JVM прозрачным — он происходит на самом раннем этапе загрузки, до того, как игра успеет инициализировать основные состояния. Внешние лаунчеры видят единый непрерывный процесс: никаких лишних окон, никаких осиротевших процессов. Игрок просто запускает игру, а всё волшебство происходит внутри.
Поддерживаемые версии и загрузчики
Одна из сильнейших сторон Relauncher — широчайшая совместимость. Библиотека работает с Java от 8 до 25 и на всех популярных платформах: Linux, Windows, macOS, включая архитектуры x86_64 и aarch64. Что касается загрузчиков модов, список впечатляет:
- Forge (LaunchWrapper) — 1.6.4 – 1.12.2, через ITweaker
- Forge (ModLauncher) — 1.13.2 и выше, через ITransformationService
- NeoForge (ModLauncher) — до 1.21.1, аналогично через SPI
- NeoForge (FancyModLoader) — 1.21.3+, IModFileCandidateLocator
- Fabric — 1.14+, PreLaunchEntrypoint
- Quilt — использует точку входа Fabric
- Hytale Server — как ранний плагин или обычный плагин
Такая гибкость делает Relauncher незаменимым инструментом для мододелов, которые хотят обеспечить корректную работу своих проектов в любом окружении.
Установка и первый запуск
Установка проста до безобразия. Скачайте универсальный JAR-файл с названием вида relauncher-universal-<версия>.jar и поместите его в папку mods/. После первого запуска игры Relauncher автоматически создаст конфигурационный файл по пути config/relauncher/config.cfg. Кстати, если вы пользуетесь лаунчером foxygame.net, весь процесс становится ещё удобнее: этот современный лаунчер позволяет устанавливать моды прямо из своего меню, так что вам не придётся вручную копировать JAR-файлы и следить за их расположением. Останется лишь один раз запустить игру, чтобы появился конфиг.
Настройка конфигурации
Файл config.cfg выглядит предельно понятно. В нём можно указать любые дополнительные аргументы JVM — по одному на строку. Комментарии начинаются с символа #, пустые строки игнорируются. Ключевой параметр enabled = true управляет только аргументами из этого файла: если другой мод предоставит реализацию интерфейса CommandLineProvider, перезапуск произойдёт независимо от флага. Пример типичного конфига:
# Relauncher Configuration enabled = true -XX:+UseG1GC -XX:+AlwaysPreTouch -Dsome.java.property=true
Такая гибкость позволяет, например, включить экспериментальный сборщик мусора ZGC или задать системное свойство, не трогая настройки лаунчера.
Совместимость с лаунчерами
Relauncher отлично работает с большинством популярных лаунчеров. Vanilla, PrismLauncher, CurseForge, Modrinth, ATLauncher — все они поддерживаются без проблем. Единственное исключение — MultiMC, который использует протокол stdin, не поддающийся воспроизведению после перезапуска. В этом случае Relauncher честно предупреждает в логе и пропускает перезапуск. Если вы столкнулись с такой ситуацией, проще сменить лаунчер или вручную добавить нужные аргументы JVM.
Как это работает изнутри
Библиотека пробует три стратегии перезапуска в порядке предпочтения. На Linux и macOS используется нативный POSIX exec через Rust-библиотеку: процесс заменяется на месте с тем же PID, что даёт нулевые накладные расходы. На Windows подключается DLL, которая в момент завершения JVM порождает дочерний процесс, предварительно дублируя stdin/stdout/stderr. Если нативные методы недоступны, срабатывает чисто Java-запасной вариант через ProcessBuilder и waitFor — он универсален, но оригинальный процесс остаётся висеть на всё время сессии. Важно помнить, что CurseForge-издание не включает нативные библиотеки из-за политики платформы, поэтому на Windows без ручного добавления natives возможна неточная реконструкция командной строки.
Инструменты для разработчиков
Relauncher дружелюбен и к создателям модов. Основной API опубликован в Maven Central, достаточно добавить зависимость compileOnly 'com.juanmuscaria:relauncher-core:<версия>'. Вызвать перезапуск программно можно одной строкой: Relauncher.relaunch(extraArgs). Если перезапуск не произошёл, метод вернёт объект RelaunchResult с понятным описанием причины. Для ещё более глубокой интеграции реализуйте интерфейс CommandLineProvider и зарегистрируйте его через ServiceLoader — Relauncher сам просканирует папку mods и подхватит ваши аргументы ещё до загрузки мода.
Проверить, был ли выполнен перезапуск, можно с помощью Relauncher.isRelaunched() и Relauncher.getDepth(). А флаг -Drelauncher.debug=true выведет подробный лог всего процесса — незаменимая вещь при отладке.
Заключение
Relauncher — это маленькая, но продуманная до мелочей библиотека, которая снимает с плеч игроков и мододелов головную боль по управлению параметрами JVM. Она работает незаметно, поддерживает практически все мыслимые версии Minecraft и загрузчики, а для разработчиков предоставляет чистый API. Будь то тюнинг сборщика мусора, автоматическая установка javaagent или просто желание держать конфигурацию внутри модпака — Relauncher справляется элегантно и надёжно. Если вы серьёзно занимаетесь моддингом или просто хотите выжать максимум из своей сборки, этот инструмент определённо заслуживает места в вашей папке mods.