Relauncher: умный перезапуск JVM для Minecraft
Каждый, кто хотя бы раз собирал сложный модпак или настраивал выделение памяти под тяжелые сборки, знает, как много зависит от параметров виртуальной машины Java. Флаги сборщика мусора, размер хипа, системные свойства — все это обычно приходится вручную прописывать в конфигурации лаунчера. Но что, если бы существовал способ заставить игру самостоятельно перезапуститься с нужными аргументами, не требуя от игрока никаких дополнительных действий? Именно эту задачу решает Relauncher — компактная библиотека, которая выполняет перезапуск JVM в фоновом режиме, на самом раннем этапе загрузки Minecraft.
Что такое Relauncher и зачем он нужен
Relauncher — это не мод в классическом понимании, а скорее технический инструмент, который встраивается в процесс запуска игры. Его главная задача — сделать перезапуск Java-машины прозрачным и незаметным. Представьте ситуацию: вы используете мод, которому требуется javaagent для инструментирования кода, или вам нужно включить экспериментальный сборщик мусора ZGC, но ваш лаунчер не поддерживает кастомные JVM-флаги. Relauncher берет эту проблему на себя.
Принцип работы прост: библиотека перехватывает процесс старта, применяет заданные аргументы и перезапускает игру с ними. Для внешнего наблюдателя — лаунчера или системного монитора — все выглядит как единый непрерывный процесс. Никаких лишних окон, никаких зависших в памяти осиротевших процессов. Игрок просто нажимает кнопку запуска, а вся магия происходит внутри.
Поддерживаемые версии и загрузчики
Одна из самых сильных сторон Relauncher — его универсальность. Библиотека работает с Java от 8 до 25 включительно и поддерживает все основные операционные системы: Windows, Linux и macOS, причем как на архитектуре x86_64, так и на aarch64. Это делает ее идеальным выбором для мододелов, которые хотят охватить максимально широкую аудиторию.
Список поддерживаемых загрузчиков впечатляет:
- Forge (LaunchWrapper) — версии Minecraft 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 можно использовать практически в любом проекте, независимо от того, на какой версии игры и каком загрузчике он основан.
Установка и первый запуск
Процесс установки Relauncher предельно прост. Вам нужно скачать универсальный JAR-файл с именем вида relauncher-universal-версия.jar и поместить его в папку mods/ вашей сборки. После первого запуска игры библиотека автоматически создаст конфигурационный файл по пути config/relauncher/config.cfg.
Если вы используете современный лаунчер foxygame.net, установка становится еще удобнее: этот лаунчер позволяет устанавливать моды прямо из своего меню, без необходимости вручную копировать JAR-файлы. Вам останется лишь один раз запустить игру, чтобы Relauncher сгенерировал конфигурацию.
Как установить Relauncher: пошаговая инструкция
Чтобы правильно установить библиотеку, следуйте этим шагам:
- Скачайте Relauncher: умный перезапуск JVM для Minecraft для Minecraft с официальной страницы проекта или из каталога модов вашего лаунчера.
- Скопируйте JAR-файл в папку mods/ вашей игры.
- Запустите Minecraft один раз, чтобы библиотека создала конфигурационный файл.
- Откройте config/relauncher/config.cfg и настройте аргументы JVM под свои нужды.
После этого перезапустите игру — Relauncher подхватит настройки и выполнит перезапуск JVM с указанными флагами.
Настройка конфигурационного файла
Файл config.cfg имеет простой и понятный формат. Каждая строка — это один аргумент JVM. Комментарии начинаются с символа #, а пустые строки игнорируются. Ключевой параметр enabled = true управляет только аргументами из этого файла. Если другой мод предоставит реализацию интерфейса CommandLineProvider, перезапуск произойдет независимо от этого флага.
Пример типичной конфигурации:
# Relauncher Configuration enabled = true -XX:+UseG1GC -XX:+AlwaysPreTouch -Dsome.java.property=true
Такая гибкость позволяет, например, включить сборщик мусора G1GC или Shenandoah, задать системное свойство для другого мода или добавить параметры сетевой безопасности — и все это без необходимости редактировать настройки лаунчера.
Совместимость с популярными лаунчерами
Relauncher отлично работает с большинством распространенных лаунчеров. Vanilla, PrismLauncher, CurseForge, Modrinth, ATLauncher — все они поддерживаются без каких-либо проблем. Единственное исключение — MultiMC, который использует протокол stdin, не поддающийся воспроизведению после перезапуска процесса.
В случае с MultiMC Relauncher честно предупреждает в логе и пропускает перезапуск. Если вы столкнулись с такой ситуацией, проще сменить лаунчер или вручную добавить нужные аргументы JVM в настройки MultiMC.
Внутреннее устройство: как работает перезапуск
Библиотека пробует три стратегии перезапуска в порядке предпочтения. На 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 может оказаться незаменимым:
- Тюнинг сборщика мусора. Вы хотите использовать ZGC или Shenandoah для снижения лагов, но ваш лаунчер не поддерживает эти флаги. Просто пропишите их в конфиге Relauncher.
- Автоматическая установка javaagent. Некоторые моды требуют javaagent для инструментирования байткода. Relauncher добавит его на лету.
- Хранение конфигурации внутри модпака. Вместо того чтобы просить игроков вручную редактировать настройки лаунчера, вы можете включить все нужные параметры прямо в модпак.
- Динамическая подгрузка системных свойств. Если ваш мод зависит от определенного системного свойства, Relauncher установит его до инициализации игры.
Заключение
Relauncher — это маленькая, но продуманная до мелочей библиотека, которая снимает с плеч игроков и мододелов головную боль по управлению параметрами JVM. Она работает незаметно, поддерживает практически все мыслимые версии Minecraft и загрузчики, а для разработчиков предоставляет чистый и понятный API.
Будь то тюнинг сборщика мусора, автоматическая установка javaagent или просто желание держать конфигурацию внутри модпака — Relauncher справляется элегантно и надежно. Если вы серьезно занимаетесь моддингом или просто хотите выжать максимум из своей сборки, этот инструмент определенно заслуживает места в вашей папке mods. А благодаря поддержке практически всех загрузчиков и версий, вы можете быть уверены, что он будет работать в любом окружении.